其实好像并不难,因为猫老师(应该是猫老师吧,还是LX大佬?)有一句话让我印象深刻:“包的(border)的包的还是包的”=。=
统计个数不就是统计长度么,然后根据上面那句话,当$nxt$长度大于$frac{len}{2}$时我们就不断跳$nxt$直到满足条件即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1e6+6; 6 const long long mod=1e9+7; 7 int nxt[N],num[N]; 8 long long ans; 9 int T,len,p; 10 char rd[N]; 11 void gtmd() 12 { 13 memset(nxt,0,sizeof nxt); 14 memset(num,0,sizeof num); 15 len=strlen(rd),p=0,num[1]=1; 16 } 17 int main () 18 { 19 scanf("%d",&T); 20 while(T--) 21 { 22 scanf("%s",rd),gtmd(); 23 for(int i=1;i<len;i++) 24 { 25 while(p&&rd[i]!=rd[p]) p=nxt[p]; 26 nxt[i+1]=(rd[i]==rd[p])?++p:0,num[i+1]=num[p]+1; 27 } 28 p=0,ans=1; 29 for(int i=1;i<len;i++) 30 { 31 while(p&&rd[i]!=rd[p]) p=nxt[p]; 32 p+=(rd[i]==rd[p]); 33 while(p&&(p<<1)>i+1) p=nxt[p]; 34 ans*=(num[p]+1),ans%=mod; 35 } 36 printf("%lld ",ans); 37 } 38 return 0; 39 }