洛谷P2375 [NOI2014] 动物园

news/2024/10/11 2:19:39

动物园

题目描述

输入格式

输出格式

输入输出样例

输入
3
aaaaa
ab
abcababc
输出
36
1
32

开始时都没看出来这是kmp板子题

先看看AC代码吧
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
const int mod=1e9+7;
char a[maxn];
int len,p[maxn],num[maxn];
//num[i]表示从i跳border能跳多少次,与题中的num数组含义不同 
void kmp()
{num[1]=1; len=strlen(a+1);for (int i=2,j=0;i<=len;i++){while (j&&a[j+1]!=a[i]) j=p[j];if (a[j+1]==a[i]) j++;p[i]=j;num[i]=num[j]+1;//递推 }
}
ll ans;
void solve()
{ans=1;for (int i=2,j=0;i<=len;i++){while (j&&a[i]!=a[j+1]) j=p[j];if (a[i]==a[j+1]) j++;while ((j<<1)>i) j=p[j];ans=ans*(num[j]+1)%mod;}printf("%lld\n",ans);
}
int main()
{int n;scanf("%d",&n);while (n--){scanf("%s",a+1);kmp();solve();}return 0;
}

注意事项

  • num[i]表示从i跳border能跳多少次,与题中的num数组含义不同
    从i跳border能跳多少次就表示可重叠的真前缀个数
    (题目中表示不重叠的真前缀个数)
  • 查找时每次j都从上一次j<=(i/2)时继承(不然会T)

错误示范:

void solve()
{ans=1;for (int i=1;i<=len;i++){int j=i;//遇到hack数据aaaaaaaaaaaaaa时每次向前跳一次会Twhile ((j<<1)>i) j=p[j];ans=ans*(num[j]+1)%mod;}printf("%lld\n",ans);
}

正确示范:

void solve()
{ans=1;for (int i=2,j=0;i<=len;i++){while (j&&a[i]!=a[j+1]) j=p[j];if (a[i]==a[j+1]) j++;while ((j<<1)>i) j=p[j];ans=ans*(num[j]+1)%mod;}printf("%lld\n",ans);
}

如上图中15号位的j由14号位的j+1继承而来(虽然由于有重叠会往前跳但那是之后的事
如果是错误代码则会从i开始一位一位往前跳时间复杂度太高会T

完结撒花!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

List的remove()方法详解

https://blog.csdn.net/anxin_hw/article/details/128312846 一、错误使用场景 1、普通for循环遍历List删除指定元素,list.remove(index) 示例:将姓张的名字移除掉List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", &…

软考备考1

【BV1Qc411G7fB】考试形式 考45分就行上午-计算机与软件工程知识-150分钟,笔试,选择题-75分还有5分时专业英语,,一篇文章挖5个空下午-软件设计-150分钟-笔试-简答题-75分三个复习阶段考点理论学习——建立理论框架 题型全覆盖——考试全部题型了然于胸 真题强化训练——适应…

AWVS

工具说明 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,他通过网络爬虫测试你的网站安全,检测流行安全漏洞。 AWVS可以通过SQL注入攻击、XSS(跨站脚本攻击)、目录遍历、代码执行等漏洞来审核Web应用程序的安全性并输出扫描报告。相对于…

树状数组(二维偏序)

题目链接 https://leetcode.cn/problems/maximum-sum-queries/description/ 题目大意题目思路 二维偏序问题 -> 一维排序,一维树状数组! 题目代码 class Solution { public:int sz;vector<int> tr;int lowbit(int x){return x & -x;}void update(int x,int k){f…

游戏排名算法:Elo、Glicko、TrueSkill

Elo rating system Elo等级分制度(英语:Elo rating system)是指由匈牙利裔美国物理学家Arpad Elo创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估公认的权威标准。 两个选手(player)在排名系统的不同,可以用来预测比赛结果。两个具有相同排名(rating)的…

lxc容器没有cron的解决办法

简介 我经常使用cron定时脚本来更新我的cloudflare ddns。 最近想着把pve上跑着的fedora,切换到lxc容器试试。 结果就遇到了没有cron的尴尬。 安装 dnf search crontab dnf install cronatbs启动 systemctl start crond 自启动 systemctl enable crond 小结 主要就是search找一…

视频局部打马赛克

给视频局部打马赛克,用手机APP剪映,操作如下: 1、打开剪映APP,点击“开始创作”,选择需要打马的视频; 2、点击下方“特效”工具-->选“画面特效”-->“基础”-->搜索“马赛克”,添加马赛克特效; 3、成功添加“马赛克”特效到创作区,根据自己需要拉长或缩短…

计算机网络体系结构

一、计算机网络概念 1、计算机网络定义 将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享的系统。 与多终端系统的区别:传统多终端系统是由中央处理器、多个联机终端及一个多用户操作系统组成。终端本身不具备独立的数据处理能…