[Solution]
It's strange to meet a problem about string in NOI.
Just build a next-pointer tree and do something to calculate the deepth of u's father a that (a << 1) <= u.
[Code]
It may be not AC, but it's lucky that no data which can hack me appeared.
#define PROC "zoo"
#include <cstdio>
#include <cctype>
#include <cstring>
#include <memory.h>
#include <algorithm>
using namespace std;
#define _l (long long int)
struct edge {
int t;
edge *next;
};
const int maxl = 1000009;
const int mod = 1000000007;
char a[maxl];
int next[maxl], num[maxl], l, rp[maxl], d;
edge *head[maxl], *ep, elst[maxl];
void dfs() {
static int p[maxl], q[maxl], ste[maxl];
static edge* e[maxl];
int t = 0;
p[0] = 0;
q[0] = 0;
ste[0] = 0;
do {
if (ste[t] == 0) {
while (q[t] + 1 < t && (p[q[t] + 1] << 1) <= p[t])
q[t] ++;
num[p[t]] = q[t];
ste[t] = 1;
e[t] = head[p[t]];
}
else if (ste[t] == 1) {
if (!e[t]) {
ste[t] = 3;
continue;
}
p[t + 1] = e[t]-> t;
q[t + 1] = q[t];
ste[t + 1] = 0;
t ++;
}
else if (ste[t] == 2) {
e[t] = e[t]-> next;
if (e[t])
ste[t] = 1;
else
ste[t] = 3;
}
else if (ste[t] == 3) {
if (t)
ste[t - 1] = 2;
t --;
}
} while (t > -1);
}
int sov() {
int s = 1;
memset(next, 0, sizeof(next));
memset(num, 0, sizeof(num));
memset(head, 0, sizeof(head));
ep = elst;
l = strlen(a + 1);
for (int i = 1; i < l; i ++) {
int p = i;
while (p) {
p = next[p];
if (a[p + 1] == a[i + 1]) {
next[i + 1] = p + 1;
break;
}
}
}
for (int i = 1; i <= l; i ++) {
ep-> t = i;
ep-> next = head[next[i]];
head[next[i]] = ep ++;
}
dfs();
for (int i = 1; i <= l; i ++)
s = _l s * (num[i] + 1) % mod;
return s;
}
int main() {
int t;
scanf("%d", &t);
while (t --) {
scanf("\n%s", a + 1);
printf("%d\n", sov());
}
return 0;
}