Peipei

In me the tiger sniffs the rose.

luogu P2375 动物园

这个题是KMP;
然后比较坑;
我们记录当前这个位置的 sum[] 是从那个位置转移过来的;
然后我们在求 next 的时候;
顺便把这个数组更新;
显然它会顺着位置前移;
最多一位;


#include "iostream"
#include "stdio.h"
#include "algorithm"
#include "cstring"
#define II int
#define C char
#define LO long long
#define R register
#define I 1324567
#define PI 1000000007
using namespace std;


II next[I], ko[I], wei[I];

C a[I];

II n,len,t;

LO ans;


void q_next()
{
    next[0]=wei[0]=-1;
    R II we=0;
    for(R II i=1;i<=len;i++)
    {
        if(a[i]==a[next[i-1]+1]) {
            next[i]=next[i-1]+1;
            we=i-1;
        } else {
            R II op=next[i-1];
            while (op!=-1 && a[i]!=a[op+1]) {
                we=op;
                op=next[op];
            }
            next[i]=op+1;
        }
        ko[i]=ko[next[i]]+1;
        we=wei[we];
        while (we!=-1 && (we*2+2>i || a[we+1]!=a[i])) {
            we=next[we];
        }
        wei[i]=we+1;
        ans*=ko[we+1]+1;
        ans%=PI;
    }
}


int main()
{
//  freopen("1.in","r",stdin);

    scanf("%d",&t);
    while (t--) {
        ans=1;
        scanf("%s",a+1);

        len=strlen(a+1);
        for(R II i=1;i<=len;i++) 
        {
            next[i]=0;
            wei[i]=0;
            ko[i]=0;
        }

        q_next();

        printf("%lld\n",ans);
    }
    exit(0);
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pretend_fal/article/details/78431049
文章标签: 算法 kmp
个人分类: luogu
想对作者说点什么? 我来说一句

动物园管理系统

2015年05月13日 5.55MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭