首页 > 其他分享 >动物园

动物园

时间:2023-04-11 17:02:25浏览次数:49  
标签:cnt 匹配 int ne ans 动物园

动物园

/*
cnt代表匹配到的位置在这里的时候,已经包含匹配好的数量
直接将第一个的值赋值为1就可以了

这里是采取匹配两次的方法,第一次求ne数组并初始化cnt
第二次是确保匹配的长度不会过大,也就是只有前面i/2个元素进行匹配,时间复杂度是o(n)
两次匹配,从而确保范围
*/

#include <bits/stdc++.h>
using namespace std;
const int M=1e6+5;
#define int long long
const int mod=1e9+7;

int ne[M],cnt[M];
//公共前缀在这里的话,匹配的数量,确实是这样的,先把第一个赋值为1就可以了
void kmp(string s,int n) {
    cnt[1]=1;
    for(int i=2,j=0;i<=n;i++) {
        while(j&&s[i]!=s[j+1])j=ne[j];
        if(s[i]==s[j+1])j++;
        ne[i]=j;
        cnt[i]=cnt[j]+1;
    }
}

signed main() {
    int TT;cin>>TT;
    while(TT--) {
        string s;cin>>s;
        int n=s.length();s=' '+s;
        kmp(s,n);
        int ans=1;
        //在这里用j控制第二个的长度,可以保证不会越界,复杂度也是可行的
        for(int i=2,j=0;i<=n;i++) {
            while(j&&s[i]!=s[j+1])j=ne[j];
            if(s[i]==s[j+1])j++;
            while(j>i/2)j=ne[j];
            ans=ans*(cnt[j]+1)%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}

标签:cnt,匹配,int,ne,ans,动物园
From: https://www.cnblogs.com/basicecho/p/17306844.html

相关文章

  • P2375 [NOI2014] 动物园
    求num[i],表示1~i前缀的合法子串个数(满足前后缀相等,且不重合 #include<iostream>#include<cstring>usingnamespacestd;constintN=1e6+3,mod=1e9+7;......
  • 洛谷P2375 [NOI2014] 动物园【题解】
    题目简要对于字符串\(......
  • 《基于 Unity3D 的虚拟现实游戏设计与实现 ——以<VR 动物园>项目为例》读后随笔
    随着虚拟现实技术和游戏行业的融合发展,具有更强沉浸感、交互性和娱乐性的VR游戏也获得了充足的发展空间,但是作为高技能人才培养的高职院校却与VR行业新技术的发展渐行......
  • BZOJ3670-[Noi2014]动物园
    3670:[Noi2014]动物园TimeLimit: 10Sec  MemoryLimit: 512MBSubmit: 3465  Solved: 1882[​​Submit​​][​​Status​​][​​Discuss​​]D......
  • P7076 [CSP-S2020] 动物园
    [CSP-S2020]动物园题目描述动物园里饲养了很多动物,饲养员小A会根据饲养动物的情况,按照《饲养指南》购买不同种类的饲料,并将购买清单发给采购员小B。具体而言,动物世......
  • P2375 [NOI2014] 动物园
    定义字符串的前\(i\)个字符组成的字符串中一最大子串\(T\)即使前缀也是后缀,且\(|T|\leqi/2\),则定义\(num[i]=|T|\),求\(num[i]+1\)之积\(mod\)1000000007。\(......