HUST 1328

来源:互联网 发布:报表软件下载 编辑:程序博客网 时间:2024/06/04 19:21

主要利用next数组

O(n)时间遍历字符串,计算当前以i结尾的字符串有几个和要求字符串匹配的

#include<stdio.h>#include<string.h>char s[100100];int next[100100];void getnext(){int i=1,j=0,k;next[1]=0;k=strlen(&s[1]);while(i<=k+1){if(j==0 || s[i]==s[j]){i++,j++;next[i]=j;}elsej=next[j];}}int main(){int t,T,i,len;int ans[100100];long long all;scanf("%d",&T);for(t=1;t<=T;t++){    all=0;    scanf("%s",&s[1]);    memset(ans,0,sizeof(ans));    getnext();    len=strlen(&s[1]);    for(i=1;i<=len;i++){ans[i]=ans[next[i+1]-1];ans[i]+=1;all+=ans[i];    }    printf("%lld\n",all);}}