厌氧代码求助
查看原帖
厌氧代码求助
649611
Zelensky楼主2025/2/8 08:09
#include<bits/stdc++.h>
using namespace std;
string s;
map<int,int>T[(int)2e6];
int fa[(int)2e6],len[(int)2e6],las=0,in[(int)2e6],tot,num[(int)2e6];
int add(int to){
	int p=T[las][to]=++tot;
	len[p]=len[las]+1;
	int np=fa[las];
	int q;
	for(int i=np;i!=-1;i=fa[i]){
		if(!T[i][to])T[i][to]=p;
		else {
			np=i,q=T[i][to];
			break;
		}
	}
	if(q!=0){
		if(len[q]==len[np]+1)fa[p]=q;
		else {
			int nq=++tot;
			len[nq]=len[np]+1;
			fa[nq]=fa[q];
			fa[q]=nq;
			fa[p]=nq;
//			for(int i=0;i<26;i++)T[nq][i]=T[q][i];
			T[nq]=T[q];
			for(int i=np;i!=-1;i=fa[i]){
				if(T[i][to]==q)T[i][to]=nq;
				else break;
			}
		}
	}
	else fa[p]=0;
	las=p;
	return p;
}
long long ans=0;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin>>n;
	fa[0]=-1;
	for(int i=1;i<=n;i++){
		int to;
		cin>>to;
		int p=add(to);
		ans+=len[p]-len[fa[p]];
		cout<<ans<<endl;
	}
}

O2 RE

AC

2025/2/8 08:09
加载中...