萌新刚学KMP,0pts球跳
  • 板块灌水区
  • 楼主lfxxx_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/21 15:31
  • 上次更新2024/10/21 16:57:49
查看原帖
萌新刚学KMP,0pts球跳
795344
lfxxx_楼主2024/10/21 15:31

P2375

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5,mod=1e9+7;;
int nxt[N],num[N];
void getNext(string t)
{
	memset(nxt,0,sizeof nxt);
	memset(num,0,sizeof num);
   	int n=t.size(),i=0,j=-1;
   	nxt[0]=-1;
   	while(i<n)
   	{
   		if(j==-1||t[i]==t[j])
   		{
   			nxt[++i]=++j;
   			num[i]=num[j]+1;
//   			cout<<j<<':'<<num[j]<<"->"<<i<<':'<<num[i]<<'\n';
		}
   		else
   			j=nxt[j];
   	}
}
int KMP(string t)
{
	int n=t.size();
	int ans=1;
	for(int i=1;i<=n;++i)
	{
		int j=i;
		while(j)
		{
			if((j<<1)<=i)
			{
				(ans*=(num[j]+1))%=mod;
				break;
			}
			j=nxt[j];
		}
		if(j)nxt[i]=j;
	}
	return ans;
} 
void solve()
{
	string s;
	cin>>s;
	getNext(s);
	cout<<KMP(s)<<'\n';
} 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	for(cin>>T;T;--T)
		solve();
}
2024/10/21 15:31
加载中...