hack WA 了,求条
查看原帖
hack WA 了,求条
578029
ivyjiao楼主2024/7/28 18:17
#include<bits/stdc++.h>
using namespace std;
int n,trie[2000001][27],fail[2000001],flag[2000001],rev[2000001],cnt,vis[2000001],ins[2000001],l,maxn,ans[200001];
string s[200001],t;
void insert(string s,int now){
    int u=0;
    for(int i=0;i<s.size();i++){
        int c=s[i]-'a';
        if(!trie[u][c]) trie[u][c]=++cnt;
        u=trie[u][c];
    }
	if(!vis[u]) vis[u]=now;
    rev[now]=vis[u];
}
void getfail(){
    queue<int>q;
    for(int i=0;i<26;i++){
        if(trie[0][i]) q.push(trie[0][i]);
    }
    while(q.size()){
        int u=q.front();
        q.pop();
        for(int i=0;i<26;i++){
            if(trie[u][i]){
				fail[trie[u][i]]=trie[fail[u]][i];
				q.push(trie[u][i]);
                ins[trie[fail[u]][i]]++;
			}
            else trie[u][i]=trie[fail[u]][i];
        }
    }
}
void query(string t){
    int u=0;
    for(int i=0;i<t.size();i++){
        u=trie[u][t[i]-'a'];
        ans[u]++;
    }
}
void topu(){
    queue<int>q;
    for(int i=1;i<=cnt;i++){
        if(!ins[i]) q.push(i);
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        flag[vis[u]]=ans[u];
        int v=fail[u];
        ans[v]+=ans[u];
        if(!(--ins[v])) q.push(v);
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        insert(s[i],i);
        t+=s[i];
        t+=(char)('z'+1);
    }
    getfail();
    query(t);
    topu();
    for(int i=1;i<=n;i++) cout<<flag[rev[i]]<<endl;
}
2024/7/28 18:17
加载中...