样例都没过 QAQ
查看原帖
样例都没过 QAQ
1053726
Quintus09楼主2025/8/29 17:24
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct Suffix_Automaton{
    int link[N],trans[N][26],cnt,last,len[N],vis[N],ans[N];
    Suffix_Automaton(){cnt=1;}
    inline int insert(int ch){
        if (trans[last][ch]){
            int y=trans[last][ch],p=last;
            if (len[p]+1==len[y]) return y;
            int z=++cnt;len[z]=len[p]+1;
            link[z]=link[y],link[y]=z;
            for (;p&&trans[p][ch]==y;p=link[p]) trans[p][ch]=z;
            return z;
        }
        int p=last,x=++cnt;len[x]=len[p]+1;
        for(;p&&!trans[p][ch];p=link[p]) trans[p][ch]=x;
        if (!p) link[x]=1;
        else{
            int y=trans[p][ch];
            if (len[y]==len[p]+1) link[x]=y;
            else{
                int z=++cnt;len[z]=len[p]+1;
                for (int i=0;i<26;i++) trans[z][i]=trans[y][i];
                link[z]=link[y],link[y]=link[x]=z;
                for (;p&&trans[p][ch]==y;p=link[p]) trans[p][ch]=z;
            }
        }
        return x;
    }
    inline void getans(int n){
        for (int i=2;i<=cnt;i++){
            if (!vis[i]) continue;
            ans[vis[i]]+=len[i]-len[link[i]];
        }
        for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
    }
}sam;
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;cin>>n;
    for (int i=1;i<=n;i++){
        string s;cin>>s;
        sam.last=1;
        for (size_t j=0;j<s.size();j++){
            sam.last=sam.insert(s[j]-'a');
            int p=sam.last;
            for (;p>1;p=sam.link[p]){
            	if (sam.vis[p]==-1) continue; 
				if (sam.vis[p]==0) sam.vis[p]=i;
				else if(sam.vis[p]!=i) sam.vis[p]=-1;
			}
        }
    }
    sam.getans(n);
    return 0;
}

在发之前我有双层玄幻两层都是iqaq

2025/8/29 17:24
加载中...