仔细看完题以后,发现肯定和kmp有关,先搞出 next 数组
然后发现答案就是某一个next < i/2时的值
但是这个样子的话极限情况时n^2,发现瓶颈在于找next,然后考虑倍增一下就出来了.
注意卡常
c++代码如下:
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x ; i <= y; ++ i)
#define repd(i,x,y) for(register int i = x ; i >= y; -- i)
using namespace std;
int t;
const int N = 1e6+50,mod = 1e9+7;
int nxt[N],f[N],p[20][N],ans;
char s[N];
inline void solve()
{
int len = 0; ans = 1;
char c;
do {c = getchar(); }while(c > 'z' || c < 'a');
do {s[++len] = c; c = getchar();}while( c >= 'a' && c <= 'z');
int j = 0;
rep(i,2,len)
{
while(j && s[j+1] != s[i]) j = nxt[j];
if(s[j+1] == s[i]) ++j;
nxt[i] = j;
}
rep(i,1,len) p[0][i] = nxt[i];
rep(j,1,19)
rep(i,1,len)
p[j][i] = p[j-1][p[j-1][i]];
rep(i,1,len)
{
f[i] = f[nxt[i]] + 1;
int x = i;
repd(j,19,0)
if(nxt[p[j][x]] > i >> 1) x = p[j][x];
if(nxt[x] > i >> 1) x = nxt[x];
ans = 1ll * ans * (f[x]+1)%mod;
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&t); f[0] = -1;
while(t --) solve();
return 0;
}