inline int Get_Fail(int x,int i)
{
while(c[i]!=c[i-len[x]-1]) x=last[x];
return x;
}
int main()
{
last[0]=1; len[1]=-1;
scanf("%s",c+1); n=strlen(c+1); c[0]='~';
int lastans=0,now=1;
for(int i=1;i<=n;i++)
{
c[i]=(c[i]-97+lastans)%26+97;
now=Get_Fail(now,i);
if(!tree[now][c[i]-'a'])
{
last[++tot]=tree[Get_Fail(last[now],i)][c[i]-'a'];
tree[now][c[i]-'a']=tot; f[tot]=f[last[tot]]+1;
len[tot]=len[now]+2;
}
now=tree[now][c[i]-'a'];
lastans=f[now];
printf("%d ",lastans);
}
printf("\n");
return 0;
}
关于这段代码,个人认为不能按照类似 KMP 的方式计算复杂度。原因是:
last[++tot]=tree[Get_Fail(last[now],i)][c[i]-'a'];
这段代码虽然调用了 Get_Fail() 函数,但是 now 并没有移动到相应的位置,所以复杂度会退化吗?