017(Power Strings二刷)(KMP)
题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1466
题目思路:不知道大家在KMP算法里有没有看见这么个句子
while(j<len)
这是找next数组的时候的游标范围
这说明 j 总有走到 len-1 的时候
但是这也说明了一个问题,next[len] 是一定有值的
要么 a[k]==a[j],要么就是 k 走到了-1
而我们今天要做的题就与这个被赋值的 next[len] 有关系
(注意:以下的两种情况都默认 j=len-1)
首先,如果是 k 走到了-1 这种情况
那next[len]会得零,这他妈跟没赋值有什么区别吗
接下来顺着另一种思路剖析
当 a[k]==a[j] 的时候可能会是
ACA
k j
或者
AABAABAAB
k j
。。。。。。数不过来
但是它也有规律可循
这边以X,Y,Z这三个大写字母为字符区块来推导
发现,k 永远是会离 j 所在的区块最近的一个相同区块的最后一个
比如
X X X Y X
此时的 k 会在第三个区块的最后一个
这是可以与 j 呼应上的
或者
Y Y Y Y
此时的 k 就会在第三个区块的最后一个字符上
接下来就是重点了
next[j] 是等于 k 的
并且由于区块相同
我是可以得到从 k+1~len-1 的这块,也就是最后一块区块的长度的
如果这种时候 len 还可以整除这个区块的长度的话
那不就是等于说:“嘿,前面的东西我都对应好了,你放心大胆的用!”
循环节以及循环节的个数,全部白给
#include<bits/stdc++.h>
using namespace std;
string a;
int a0,qnext[1000001];
void hnext(string o,int o0){//next数组
int j=0,k=-1;
qnext[j]=k;
while(j<o0){
if(k==-1||o[j]==o[k]){
qnext[++j]=++k;
}
else{
k=qnext[k];
}
}
}
int main(){
while(1){
cin>>a;
if(a=="."){
return 0;
}
a0=a.size();
hnext(a,a0);
if(a0%(a0-qnext[a0])==0){//能整除
printf("%d\n",a0/(a0-qnext[a0]));
//白给
}
else{//不能
printf("1\n");
//中间被某个B区块拦路了
//直接出1就得了
}
}
return 0;
}
题目总结:这题的关键在于找到可能的循环节的长度
对某些模板程序探索一下会有意想不到的惊喜
017(Power Strings二刷)(KMP)的更多相关文章
- Power Strings (poj 2406 KMP)
Language: Default Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33205 ...
- poj 2406 Power Strings (后缀数组 || KMP)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 28859 Accepted: 12045 D ...
- (简单) POJ 2406 Power Strings,扩展KMP。
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- POJ 2406 Power Strings (KMP)
Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...
- poj 2406:Power Strings(KMP算法,next[]数组的理解)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30069 Accepted: 12553 D ...
- poj 2406 Power Strings kmp算法
点击打开链接 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27368 Accepted: ...
- 【POJ2406】 Power Strings (KMP)
Power Strings Description Given two strings a and b we define a*b to be their concatenation. For exa ...
- poj2406 Power Strings(kmp失配函数)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 39291 Accepted: 16315 Descr ...
- Power Strings(kmp妙解)
Power Strings Time Limit : 6000/3000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tota ...
随机推荐
- 「Python实用秘技07」pandas中鲜为人知的隐藏排序技巧
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第7期 ...
- OV5640图像采集(一)VGA显示
vga控制器模块 1 引言 项目的背景是采集无人车间现场的工件图像并送往控制间pc端处理,最终实现缺陷检测.项目包括图像采集模块,数据传输模块,上位机,缺陷检测算法等四个部分.其中,图像采集模块又分 ...
- C++逆向 可变参数Hook
目录 C++逆向 可变参数Hook 0x00 前言: 0x01 C++可变参数: 可变参数简介 可变参数代码实战 0x02 逆向分析C++可变参数原理 0x03 printf Hook实战 Pwn菜鸡 ...
- day01-从一个基础的socket服务说起
首发地址:day01-从一个基础的socket服务说起 教程说明:C++高性能网络服务保姆级教程 本节目的 实现一个基于socket的echo服务端和客户端 服务端监听流程 第一步:使用socket函 ...
- HashMap源码理解一下?
HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...
- Linux-SUID提权
前言 最近打靶场的时候最后都会涉及到提权,所以想着总结一下. SUID提权原理 SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用 ...
- Linux应急响应入门——入侵排查
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 账号安全: 1.用户信息文件 /etc/passwd # ...
- 不使用比较和条件判断实现min函数的一种方法
不使用比较和条件判断实现min函数,参数为两个32位无符号int. 面试的时候遇到的题目,感觉很有意思. 搜了一下多数现有的解法都是仅有两种限制之一,即要么仅要求不能使用比较,要么仅要求不能使用条件判 ...
- 关于Spring中的useSuffixPatternMatch
背景 spring-boot的版本是2.1.4.RELEASE,spring的版本是5.1.6.RELEASE 一个例子如下: @Configuration @Import(WebMvcAutoCon ...
- supervisor安装以及监控管理rabbitmq消费者进程
简介:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...