解题:NOI 2014 动物园

时间:2024-04-16 10:07:58

题面

其实好像并不难,因为猫老师(应该是猫老师吧,还是LX大佬?)有一句话让我印象深刻:“包的(border)的包的还是包的”=。=

统计个数不就是统计长度么,然后根据上面那句话,当$nxt$长度大于$\frac{len}{2}$时我们就不断跳$nxt$直到满足条件即可

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+;
const long long mod=1e9+;
int nxt[N],num[N];
long long ans;
int T,len,p;
char rd[N];
void gtmd()
{
memset(nxt,,sizeof nxt);
memset(num,,sizeof num);
len=strlen(rd),p=,num[]=;
}
int main ()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",rd),gtmd();
for(int i=;i<len;i++)
{
while(p&&rd[i]!=rd[p]) p=nxt[p];
nxt[i+]=(rd[i]==rd[p])?++p:,num[i+]=num[p]+;
}
p=,ans=;
for(int i=;i<len;i++)
{
while(p&&rd[i]!=rd[p]) p=nxt[p];
p+=(rd[i]==rd[p]);
while(p&&(p<<)>i+) p=nxt[p];
ans*=(num[p]+),ans%=mod;
}
printf("%lld\n",ans);
}
return ;
}