疑似新做法
查看原帖
疑似新做法
1284088
meifan666楼主2025/1/28 15:59

rt,这个代码逆天到自己也有点看不懂,最后靠路径压缩A的,想知道此解法的可行性,如果是错误的求Hack。正确的话我就水一篇题解

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
int T,n,ans;
string s;
queue<int>road;
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=n-1;i>=0;i--){
			int t=kmp[i];
			while(t*2>i+1){
				road.push(t);
				t=kmp[t-1];
			}
			while(!road.empty()){
				kmp[road.front()-1]=t;
				road.pop();
			}
			num[i]=(num[i]+cnt[t])%mod;
			ans=ans*(num[i]+1)%mod;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2025/1/28 15:59
加载中...