看了题解后自己写了代码,一直TLE4个点,于是一点点对照题解改。最后反复测评发现错因竟然是d[]数组开大了,不是很理解。 AC代码(看了题解1的):``` #include #include #include #define re register using namespace std;
const int maxn=3e4+10; const int maxm=3e5+10; string s[maxn],ans[maxn]; int d[26],cnt; bool e[26][26],book[maxn]; queueq;
struct Trie{ int node[maxm][26],wd[maxm],tot=1; inline void topo() { for(;!q.empty();)q.pop(); for(re int i=0;i<=25;i++) if(!d[i]) q.push(i); for(;!q.empty();) { int u=q.front(); q.pop(); for(re int i=0;i<=25;i++) if(e[u][i])//简化 if(!(--d[i])) q.push(i); } } inline void insert(string s) { int u=1;int len=s.length(); for(re int i=0;i<len;i++) { int v=s[i]-'a'; if(!node[u][v]) node[u][v]=++tot; u=node[u][v]; } wd[u]=1; } inline bool find(string s) { memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); int u=1;int len=s.length(); for(re int i=0;i<len;i++) { if(wd[u])return 0; int v=s[i]-'a'; for(re int j=0;j<=25;j++) if(j!=v&&node[u][j]&&!e[v][j]) e[v][j]=1,d[j]++; u=node[u][v]; } topo(); for(re int i=0;i<=25;i++) if(d[i]) return 0; return 1; } }tr;
int main() { int n;cin>>n; for(re int i=1;i<=n;i++) { cin>>s[i]; tr.insert(s[i]); } for(re int i=1;i<=n;i++) if(tr.find(s[i])) { cnt++; book[i]=1; } cout<<cnt<<'\n'; for(re int i=1;i<=n;i++) if(book[i])cout<<s[i]<<'\n'; }
TLE代码:
#include #include #include #define re register using namespace std;
const int maxn=3e4+10; const int maxm=3e5+10; string s[maxn],ans[maxn]; int d[maxm],cnt;//TLE所在 bool e[26][26],book[maxn]; queueq;
struct Trie{ int node[maxm][26],wd[maxm],tot=1; inline bool topo() { for(;!q.empty();)q.pop(); for(re int i=0;i<=25;i++) if(!d[i]) q.push(i); for(;!q.empty();) { int u=q.front(); q.pop(); for(re int i=0;i<=25;i++) if(e[u][i]) { e[u][i]=0;//不需要删边,因为队列中的点入度为0,没有边能访问到它 if(!(--d[i])) q.push(i); }
}
for(re int i=0;i<=25;i++)
if(d[i])
return 0;
return 1;
}
inline void insert(string s)
{
int u=1;int len=s.length();
for(re int i=0;i<len;i++)
{
int v=s[i]-'a';
if(!node[u][v])
node[u][v]=++tot;
u=node[u][v];
}
wd[u]=1;
}
inline bool find(string s)
{
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
int u=1;int len=s.length();
for(re int i=0;i<len;i++)
{
if(wd[u])return 0;
int v=s[i]-'a';
for(re int j=0;j<=25;j++)
if(j!=v&&node[u][j]&&!e[v][j])
e[v][j]=1,d[j]++;
u=node[u][v];
}
return topo();
}
}tr;
int main() { int n;cin>>n; for(re int i=1;i<=n;i++) { cin>>s[i]; tr.insert(s[i]); } for(re int i=1;i<=n;i++) if(tr.find(s[i])) { cnt++; book[i]=1; } cout<<cnt<<'\n'; for(re int i=1;i<=n;i++) if(book[i])cout<<s[i]<<'\n'; }