交到UOJ就A了
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define maxn 1000000
#define mod 1000000007
#define ll long long
using namespace std;
int t;
ll ans;
char s[maxn + 10];
int len,p,top,nxt[maxn + 10],pos[maxn + 10],dep[maxn + 10],st[maxn + 10];
vector<int> g[maxn + 10];
void getnxt()
{
nxt[0] = -1;
for(int i = 1;i <= len;i++)
{
int now = nxt[i-1];
while((now != -1) && (s[now+1] != s[i])) now = nxt[now];
nxt[i] = now + 1;
g[nxt[i]].push_back(i);
dep[i] = dep[nxt[i]] + 1;
}
}
void dfs(int u)
{
st[++top] = u;
while(p + 1 <= top && st[p + 1] <= u / 2) p++;
ans = ans % mod * (dep[st[p]] + 1) % mod,pos[u] = st[p];
for(int i = 0;i < g[u].size();i++) dfs(g[u][i]);
st[top] = 0;
top--;
p = pos[nxt[u]];
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s",s+1);
len = strlen(s+1);
memset(g,0,sizeof(g));
memset(nxt,0,sizeof(nxt));
memset(pos,0,sizeof(pos));
memset(dep,0,sizeof(dep));
memset(st,0,sizeof(st));
ans = 1;
getnxt();
p = 1,top = 0;
dfs(0);
printf("%lld\n",ans);
}
//cerr<<(sizeof(s) + sizeof(nxt) + sizeof(pos) + sizeof(dep) + sizeof(st) + sizeof(g)) / 1024.0 / 1024.0;
return 0;
}