题解

2 条题解

  • 0
    @ 2016-07-22 01:26:46

    #include <cstdio>

    const int maxN=1e6+5;
    const int mod=1e9+7;

    char str[maxN];
    int next[maxN];
    int num[maxN];

    int solve()
    {
    next[0]=num[0]=-1;
    for(int i=1;str[i];i++)
    {
    int k=next[i-1];
    while(k!=-1 && str[k+1]!=str[i]) k=next[k];
    next[i]=(++k);
    num[i]=num[k]+1;
    }
    long long ans(1);
    int fix(-1);
    for(int i=1;str[i];i++)
    {
    while(fix!=-1 && str[fix+1]!=str[i]) fix=next[fix];
    if(++fix) while((fix<<1) > i) fix=next[fix];
    ans=(ans*(num[fix]+2))%mod;
    }
    return (int)ans;
    }

    int main()
    {
    int T; scanf("%d",&T);
    while(T--)
    {
    scanf("%s",str+1);
    printf("%d\n",solve());
    //for(int i=1;str[i];i++) printf("%d %d\n",next[i],num[i]);
    }
    return 0;
    }

  • 0
    @ 2016-01-10 18:27:24

    虽然我没有AC但我来抢个沙发

  • 1

信息

ID
1866
难度
6
分类
(无)
标签
递交数
236
已通过
66
通过率
28%
被复制
2
上传者