题目:
重点是记录一个cnt数组表示自己这个串能匹配几次。如果记录的是不包含自己第一次匹配上的那种(如代码),要注意判断。
学习到了优美写法。就是用两个全局变量的指针而不是每次都 int k=nxt[ i-1 ]。
而且那个while写得也很好!这样就不用特别判断没匹配上的情况了。
注意输出换行。
#include#include #include #define ll long longusing namespace std;const int N=1e6+5;const ll mod=1e9+7;int T,len,nxt[N],cnt[N],k,ct;char a[N];ll sum;int main(){ scanf("%d",&T); while(T--) { sum=1;k=ct=0;// memset(cnt,0,sizeof cnt); scanf("%s",a+1);len=strlen(a+1); for(int i=2;i<=len;i++) { ll nm=0; while(k&&a[k+1]!=a[i])k=nxt[k]; if(a[k+1]==a[i])k++; nxt[i]=k;if(k)cnt[i]=cnt[k]+1;//if k while(ct&&a[ct+1]!=a[i])ct=nxt[ct]; if(a[ct+1]==a[i])ct++; while(ct>(i>>1))ct=nxt[ct];// if(ct)nm=cnt[ct]+1;//if ct (sum*=nm+1)%=mod; } printf("%lld\n",sum); } return 0;}