求助,第一个点就极为神秘的TLE了
查看原帖
求助,第一个点就极为神秘的TLE了
520056
luoyx楼主2023/8/17 14:00
#include <bits/stdc++.h>
using namespace std;
int tot=1,lst=1;
const int N=1e5+6;
struct node{
	int ch[30];
	int len,fa;
	void init(){
		for(int i=0;i<30;i++) ch[i]=0;
		len=fa=0;
	}
}tr[N];
long long dp[N];
long long ans=0;
void insert(int c){
	int p=lst,np=lst=++tot;
	dp[np]=1;
	tr[np].len=tr[p].len+1;
	for(;p&&!tr[p].ch[c];p=tr[p].fa) tr[p].ch[c]=np;
	if(!p) tr[np].fa=1;
	else{
		int q=tr[p].ch[c];
		if(tr[p].len==tr[q].len-1) tr[np].fa=q;
		else{
			int nq=++tot;
			tr[nq]=tr[q],tr[nq].len=tr[p].len+1;
			tr[q].fa=tr[np].fa=nq;
			for(;p&&tr[p].ch[c]==q;p=tr[p].fa) tr[p].ch[c]=nq;
		}
	}
	ans+=tr[np].len-tr[tr[np].fa].len;
}

char s[N];
int sl;
struct edge{
	int v,nxt;
}e[N];
int head[N],ecnt;
void add(int u,int v){
	e[++ecnt].v=v;
	e[ecnt].nxt=head[u];
	head[u]=ecnt;
}
void dfs(int u){
	for(int i=head[u];i;i=e[i].nxt){
		dfs(e[i].v);
		dp[u]+=dp[e[i].v];
	}
	ans+=dp[u];
}

int main(){
	int t=0;
	cin>>t;
	while(t--){
		scanf("%s",s+1);
		sl=strlen(s+1);
		lst=tot=1;
		for(int i=1;i<=sl;i++) tr[i].init();
		for(int i=1;i<=sl;i++) insert(s[i]-'a');
		ecnt=0;
		for(int i=2;i<=tot;i++) add(tr[i].fa,i);
		for(int i=1;i<=tot;i++) dp[i]=0;
		cout<<ans<<endl;
		ans=0;
	}
	
}
2023/8/17 14:00
加载中...