蒟蒻不明白为何后者AC,前者MLE,QWQ

P3796 AC 自动机(简单版 II)

``` #include<bits/stdc++.h> #define add_SUU ios::sync_with_stdio(false);cin.tie(0),cout.tie(0); #define int long long #define x first #define y second #define inf 0x3f3f3f3f3f3f3f3f #define iter set<pii>::iterator using namespace std; typedef pair<int,int> pii; const int maxn=5e4+34; int MOD=1e9+7; int tot,cnt,idx; int trie[maxn][27]; //int cntWord[maxn]; int fail[maxn]; int MAX,tim[maxn],No[maxn]; //vector<int>vis(maxn); //vector<vector<int>>str(maxn); void insert(string s,int id){ int root=0; for(char ch:s){ int nex=ch-'a'+1; if(!trie[root][nex])trie[root][nex]=++tot; root=trie[root][nex]; } No[root]=id; } void get_fail(){ queue<int>que; for(int i=1;i<=26;i++){ if(trie[0][i]){ fail[trie[0][i]]=0; que.push(trie[0][i]); } } while(que.size()){ int u=que.front(); que.pop(); for(int i=1;i<=26;i++){ if(trie[u][i]){ fail[trie[u][i]]=trie[fail[u]][i]; que.push(trie[u][i]); } else trie[u][i]=trie[fail[u]][i]; } } } void ask(string s){ int now=0; for(char ch:s){ now=trie[now][ch-'a'+1]; for(int i=now;i;i=fail[i])tim[No[i]]++; } } string ss[300]; void work(int n){ // int n,m,k; // cin>>n; memset(No,0,sizeof(No)); memset(tim,0,sizeof(tim)); memset(trie,0,sizeof(trie)); memset(fail,0,sizeof(fail)); for(int i=1;i<=n;i++){ tim[i]=0; cin>>ss[i]; insert(ss[i],i); } get_fail(); string s; cin>>s; ask(s); for(int i=1;i<=n;i++)MAX=max(MAX,tim[i]); cout<<MAX<<'\n'; for(int i=1;i<=n;i++){ if(tim[i]<MAX)continue; cout<<ss[i]<<'\n'; } // for(int i=1;i<=tot;i++){ // fail[i]=0; // No[i]=0; // for(int j=1;j<=26;j++)trie[i][j]=0; // } MAX=idx=tot=0; } signed main() { // add_SUU; int t=1; // cin>>t; // while(t--) int n; cin>>n; while(n){ work(n); cin>>n; } return 0; }
by DaShabby @ 2023-08-29 22:23:18


|