广义 SAM WA #17,#19,#20 求调(玄关)
查看原帖
广义 SAM WA #17,#19,#20 求调(玄关)
160150
WxjzKK楼主2023/10/27 13:42

目测 long long 是有效的。

//【模板】广义后缀自动机,广义SAM(Trie树离线构造) 
#include<bits/stdc++.h>
#define MAXL 1000005
#define MAXD 30
using namespace std;
inline void read(int &n){
	int s=0,t=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') t=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<3)+(s<<1)+(c^48);c=getchar();
	}
	n=s*t;
}
inline void put(int n){
	if(n<0){
		putchar('-');n=-n;
	}
	if(n<10){
		putchar(n+48);return;
	}
	put(n/10);
	putchar(n%10+48);
}
inline void llput(long long n){
	if(n<0){
		putchar('-');n=-n;
	}
	if(n<10){
		putchar(n+48);return;
	}
	put(n/10);
	putchar(n%10+48);
}
int tot,cnt,tr[MAXL],fa[MAXL],len[MAXL<<1],link[MAXL<<1],pos[MAXL],t[MAXL][MAXD],sam[MAXL<<1][MAXD];
char s[MAXL];
inline int exch(char ch){
	return ch-'a'+1;
}
inline void trie_insert(){
	int len=strlen(s),p=0,c;
	for(register int i=0;i<len;++i){
		c=exch(s[i]);
		if(!t[p][c]) t[p][c]=++tot;
		fa[t[p][c]]=p;tr[t[p][c]]=c;p=t[p][c];
	}
}
inline int sam_insert(int c,int last){
	int cur=++cnt,p=last;
	len[cur]=len[last]+1;
	while(p!=-1&&!sam[p][c]){
		sam[p][c]=cur;p=link[p];
	}
	if(p==-1) link[cur]=0;
	else{
		int q=sam[p][c];
		if(len[p]+1==len[q]) link[cur]=q;
		else{
			int clone=++cnt;
			len[clone]=len[p]+1;
			link[clone]=link[q];
			for(register int i=1;i<=26;++i) sam[clone][i]=sam[q][i];
			while(p!=-1&&sam[p][c]==q){
				sam[p][c]=clone;p=link[p];
			}
			link[cur]=link[q]=clone;
		}
	}
	return cur;
}
inline void build(){
	queue<int>q;
	for(register int i=1;i<=26;++i)
		if(t[0][i]) q.push(t[0][i]);
	link[0]=-1;
	while(!q.empty()){
		int p=q.front();q.pop();
		pos[p]=sam_insert(tr[p],pos[fa[p]]);
		for(register int i=1;i<=26;++i)
			if(t[p][i]) q.push(t[p][i]);
	}
}
inline long long getans(){
	long long ans=0;
	for(register int i=1;i<=cnt;++i) ans+=len[i]-len[link[i]];
	return ans;
}
signed main(){
	int n;
	read(n);
	for(register int i=1;i<=n;++i){
		cin>>s;trie_insert();
	}
	build();
	llput(getans());putchar('\n');put(cnt+1);putchar('\n');
	return 0;
}

2023/10/27 13:42
加载中...