Typesetting math: 100%

【BZOJ】3670: [Noi2014]动物园(KMP)

题目

传送门:QWQ

 


分析

 

像求next一样求num。

第二次求next时加上不超过一半的条件。

时间复杂度: O(n)


 

代码

 

复制代码
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int MOD=1000000007;
int n, nxt[1000007], num[1000007];
char s1[1000007];
long long ans;

void kmp()
{
    ans=1;
    nxt[0]=-1; num[1]=1;
    for(int i=1,j;i<=n;i++)
    {
        for(j=nxt[i-1]; j>=0 && s1[i]!=s1[j+1]; j=nxt[j]);
        j++; nxt[i]=j;
        num[i]=num[j]+1;
    }
    for(int i=1,j=-1;i<=n;i++)
    {
        for(; j>=0 && s1[i]!=s1[j+1]; j=nxt[j]);
        j++;  //nxt[i]=j;
        for(;(j<<1)>i;j=nxt[j]);
        ans*=num[j]+1;ans%=MOD;
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",s1+1);
        n=strlen(s1+1)+1;
        kmp();
        printf("%lld\n",ans);
    }
    return 0;
}
View Code
复制代码

 

 

 

 【洛谷】P3919 【模板】可持久化数组(主席树)



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   noble_(noblex)  阅读(129)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
/* */
点击右上角即可分享
微信分享提示