Description
Input
Output
Sample Input
Sample Output
HINT
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define mod 1000000007
#define N 1000000
using namespace std;
int T,st;
long long ans=1;
string opt;
int num[N],last[N];
void kmp()
{
int j=0;
for(int i=2;i<=st;i++)
{
while(j && opt[j+1]!=opt[i]) j=last[j];
if(opt[j+1]==opt[i]) j++;
last[i]=j;
num[i]=num[j]+1;
}
j=0;
for(int i=2;i<=st;i++)
{
while(j && opt[j+1] != opt[i]) j=last[j];
if(opt[j+1]==opt[i]) j++;
while(j<<1 > i) j=last[j];
ans=ans*(num[j]+1)%mod;
}
}
int main()
{
scanf("%d",&T);
num[1]=1;
while(T--)
{
ans=1;
cin>>opt;
st=opt.length();
opt=" "+opt;
kmp();
printf("%d\n",ans);
}
return 0;
}
kmp建树:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
int fail[N] , num[N] , head[N] , to[N] , last[N] , cnt , sta[N] , top;
char str[N];
void add(int x , int y)
{
to[++cnt] = y , last[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x)
{
int i;
sta[++top] = x;
for(i = head[x] ; i ; i = last[i])
num[to[i]] = upper_bound(sta + 1 , sta + top + 1 , to[i] >> 1) - sta - 1 , dfs(to[i]);
sta[top -- ] = x;
}
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
int n , i = 0 , j = -1;
long long ans = 1;
memset(head , 0 , sizeof(head)) , cnt = 1;
scanf("%s" , str) , n = strlen(str);
fail[0] = -1;
while(i < n)
{
while(~j && str[j] != str[i]) j = fail[j];
fail[++i] = ++j;
}
for(i = 1 ; i <= n ; i ++ ) add(fail[i] , i);
dfs(0);
for(i = 1 ; i <= n ; i ++ ) ans = ans * num[i] % 1000000007;
printf("%lld\n" , ans);
}
return 0;
}