菜鸡SAM求助QAQ
查看原帖
菜鸡SAM求助QAQ
35891
huangzirui楼主2021/4/7 22:12

RT.

一直WA成16 QAQ

#include <bits/stdc++.h>
#define ll long long
#define Mid ((L+R)>>1)
using namespace std;
typedef pair<int,int> pii;
inline int read(){
	char c;int x=0;int b=1;do{c=getchar();if(c==45)b=-1;}while(c>57||c<48);
	do x=x*10+c-48,c=getchar();while(c<=57&&c>=48);x*=b;return x;
}
const int maxn=500010;
struct node{
	int c[27],sum,is,len,link;
}a[maxn];
struct trie{
	int son[27],last,b;
}t[maxn*20];int cnt2=1;
int cnt=1,g[maxn],Q[maxn],top;
int insert(int now,char c,int s){
	int S=c-'a'+1,p=++cnt;
	a[p].len=a[now].len+1;a[p].is=s;
	while(now && !a[now].c[S])a[now].c[S]=p,now=a[now].link;
	if(!now)a[p].link=1;
	else{
		int to=a[now].c[S];
		if(a[to].len-a[now].len==1)a[p].link=to;
		else{
			int clone=++cnt;
			a[clone]=a[to];
			a[clone].is=0;
			a[clone].len=a[now].len+1;
			while(now && a[now].c[s]==to)a[now].c[s]=clone,now=a[now].link;
			a[p].link=a[to].link=clone;
		}
	}return p;
}
string S[maxn];
void INSERT(int x){
	int now=1,fa=-1;
	for(int i=0;i<S[x].size();i++){
		int s=S[x][i]-'a'+1;fa=now;
		//cout<<"INSERTing... now="<<now<<endl;
		if(!t[now].son[s])t[now].son[s]=++cnt2;
		now=t[now].son[s];
		if(!t[now].last)t[now].last=insert(t[fa].last,S[x][i],x),t[now].b=x;
		else{a[t[now].last].is=-1;}
	}
}
int i,j,k,n,m,last;ll ans[maxn];
int main() {
	freopen("P4081.in","r",stdin);
	freopen("P4081.out","w",stdout);
	cin>>n;t[1].last=1;
	for(i=1;i<=n;i++)cin>>S[i];
	for(i=1;i<=n;i++)INSERT(i);
	for(i=1;i<=cnt;i++)g[a[i].link]++;
	for(i=1;i<=cnt;i++)if(!g[i])Q[++top]=i;
	while(top){
		int now=Q[top--];
		if(!now)continue;
		if(a[now].is>0)ans[a[now].is]+=a[now].len-a[a[now].link].len;
		if(a[a[now].link].is!=a[now].is)a[a[now].link].is=(a[a[now].link].is?-1:a[now].is);
		g[a[now].link]--;if(!g[a[now].link])Q[++top]=a[now].link;
	}
	for(i=1;i<=n;i++)printf("%d\n",ans[i]);
	cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
	return 0;
}
2021/4/7 22:12
加载中...