KMP——BZOJ3670/Luogu2375 [Noi2014]动物园

来源:互联网 发布:购物软件哪个好 编辑:程序博客网 时间:2024/05/31 19:56

http://www.lydsy.com/JudgeOnline/problem.php?id=3670
https://www.luogu.org/problem/show?pid=2375
洛谷有分点信息真好。。。(用多了不好不利于自身提高
标算Kmp,第一次写渣了BZOJ只有提示WA洛谷一测爆蛋
这题的主要坑点在于限制后缀与前缀不重叠,其他和普通的Kmp并没有什么本质区别
这个其实只要加一个限制条件判断一下就好了
还有一个坑点,处理限制重叠要与原来的分开做,否则变量指针j会出问题
意思就是说要分两个循环,我一开始一个循环就炸了
还有一个坑点,题目里面说要求这样的前缀有多少,我一开始看成了求最大前缀QAQ
所以还要再多开一个数组num。。。
还有一个坑点……
反正处处是坑

#include<bits/stdc++.h>using namespace std;int nex[1000001],l1,num[1000001]={0};char a[1000001];int main(){    long long ans;    int n;scanf("%d",&n);    while(n--){        scanf("%s",a+1);        l1=strlen(a+1);        int j=0;long long ans=1;        memset(num,0,sizeof num);        num[1]=1;ans=1;        for(int i=2;i<=l1;i++){            while(j&&a[i]!=a[j+1])j=nex[j];            if(a[i]==a[j+1])j++;            nex[i]=j;num[i]=num[j]+1;        }        j=0;        for(int i=2;i<=l1;i++){            while(j&&a[i]!=a[j+1])j=nex[j];            if(a[i]==a[j+1])j++;            while(j&&j>i/2)j=nex[j];            ans=ans*(num[j]+1)%1000000007;        }        printf("%lld\n",ans);    }    return 0;}
1 0
原创粉丝点击