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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值