诶我都不知道怎么过的?。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000050 #define mod 1000000007 using namespace std; char s[maxn]; int n,nxt[maxn],num[maxn],t,f[maxn]; void get_nxt() { memset(nxt,0,sizeof(nxt));memset(f,0,sizeof(f)); int cnt=0;f[1]=1; for (int i=2;i<=n;i++) { while ((cnt) && (s[i-1]!=s[cnt])) cnt=nxt[cnt]; if (s[i-1]==s[cnt]) cnt++; nxt[i]=cnt;f[i]=f[nxt[i]]+1; } } void get_num() { memset(num,0,sizeof(num)); int cnt=0; for (int i=2;i<=n;i++) { while ((cnt) && ((s[i-1]!=s[cnt]) || ((cnt+1)*2>i))) cnt=nxt[cnt]; if (s[i-1]==s[cnt]) cnt++; num[i]=f[cnt]; } } void work() { scanf("%s",s);n=strlen(s); get_nxt();get_num(); long long ans=1; for (int i=1;i<=n;i++) ans=(ans*(num[i]+1))%mod; printf("%lld\n",ans); } int main() { scanf("%d",&t); for (int i=1;i<=t;i++) work(); return 0; }