KMP失配树求调
查看原帖
KMP失配树求调
546681
lcbridgeAK CSP-S楼主2023/7/29 19:21

样例已过,WA0

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int mod=1e9+7;
int T,nxt[N],num[N],D[N]; 
char s[N];
void init(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
}
signed main(){
	//init();
	cin>>T;
	while(T--){
		int ans=1;
		cin>>(s+1);
		int n=strlen(s+1);
		nxt[1]=num[1]=0;
		D[1]=1;
		for(int i=2;i<=n;i++){
			int j=nxt[i-1];
			while(j!=0){
				if(s[j+1]==s[i])break;
				else j=nxt[j];
			}
			if(s[j+1]==s[i])nxt[i]=j+1;
			else nxt[i]=0;
			D[i]=D[nxt[i]]+1;
			int k=num[i-1]; 
			while(k!=0){
				if(s[k+1]==s[i]&&(2*(k+1)<=i))break;
				else k=num[k];
			}
			if(s[k+1]==s[i]&&(2*(k+1)<=i))num[i]=k+1;
			else num[i]=0;
			ans=ans*(D[num[i]]+1)%mod;
		}
		cout<<ans<<"\n";
	}
	return 0;
}
2023/7/29 19:21
加载中...