50求优化(优化部分已注释)
查看原帖
50求优化(优化部分已注释)
1284088
meifan666楼主2025/1/27 17:17
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
int T,n,ans;
string s;
int kmp[1001000],num[1001000];
int cnt[1001000];
bool vis[1001000];
int DFS(int x){
	if(vis[x])return cnt[x];
	if(x==0)return 0;
	vis[x]=1;
	cnt[x]=DFS(kmp[x-1])+1;
	return cnt[x];
}
signed main(){
	cin>>T;
	while(T--){
		cin>>s;
		int j=0,ans=1;
		n=s.size();
		num[0]=kmp[0]=cnt[0]=0;
		for(int i=1;i<n;i++){
			num[i]=0,kmp[i]=0,cnt[i]=0,vis[i]=0;
			while(j&&s[i]!=s[j])j=kmp[j-1];
			if(s[i]==s[j])j++;
			kmp[i]=j;
		}
		for(int i=n;i>0;i--)DFS(i);
		for(int i=0;i<n;i++){
			int t=kmp[i];
			while(t*2>i+1)t=kmp[t-1];//此处不够优秀
			num[i]=(num[i]+cnt[t])%mod;
			ans=ans*(num[i]+1)%mod;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2025/1/27 17:17
加载中...