num 数组实际上就是不过半且最长的前后缀的深度,然后正常跑 kmp 即可。
#include <bits/stdc++.h>
using namespace std;
const int N = (int) 1e6 + 10, mod = (int) 1e9 + 7;
char s[N];
int nxt[N], num[N];
signed main() {
int T;
cin >> T;
while (T --) {
int ans = 1;
num[1] = 1;
scanf ("%s", s + 1);
int n = strlen(s + 1);
for (int i = 2, j = 0; i <= n; i ++) {
while (j && s[i] != s[j + 1])
j = nxt[j];
if (s[i] == s[j + 1])
j ++;
nxt[i] = j;
num[i] = num[j] + 1;
}
for (int i = 2, j = 0; i <= n; i ++) {
while (j && s[i] != s[j + 1])
j = nxt[j];
if (s[i] == s[j + 1])
j ++;
while (j * 2 > i)
j = nxt[j];
ans = 1LL * ans * (num[j] + 1) % mod;
}
cout << ans << '\n';
}
return 0;
}