求助,SAM全WA
查看原帖
求助,SAM全WA
627307
zing_Sing楼主2023/7/17 17:05

SP705都过了,这道题死活调不出来……

#include<bits/stdc++.h>
using namespace std;
const int N=4005;
int turn(char c){
	if(c>='A'&&c<='Z')return c-'A'+1;
	return c-'a'+27;
}
int ch[N][60],fa[N],len[N],tot;
int las;
void addp(int c){
	int p=las,np=las=++tot;
	len[np]=len[p]+1;
	for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
	if(!p)fa[np]=1;
	else{
		int q=ch[p][c];
		if(len[q]==len[p]+1)fa[np]=q;
		else{
			int nq=++tot;
			for(int i=1;i<=52;i++)
				ch[nq][i]=ch[q][i];
			fa[nq]=fa[q];
			len[nq]=len[p]+1;
			fa[q]=fa[np]=nq;
			for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
		}
	}
}
int dp[N];
void dfs(int now){
	if(dp[now])return;
	dp[now]=1;
	for(int i=1;i<=52;i++)
		if(ch[now][i])
			dfs(ch[now][i]),dp[now]+=dp[ch[now][i]];
}
string s;
int main(){
	int t;
	cin>>t;
	while(t--){
		memset(ch,0,sizeof(ch));
		memset(dp,0,sizeof(dp));
		tot=las=1;
		cin>>s;
		for(int i=0;i<s.size();i++)
			addp(turn(s[i]));
		dfs(1);
		cout<<dp[1]-1<<"\n";
	}
	return 0;
}
2023/7/17 17:05
加载中...