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相关知识理解
Python3 基础了解 编码 Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串 # -*- coding: cp-1252 -*- 标识符 · 第一个字符 ...
- Java第十周作业
1.编写一个方法,实现冒泡排序(由小到大),并调用该方法 package gc; public class gc { /** * @param args */ public static void m ...
- bellman-ford 单源最短路问题 图解
核心思想:松弛操作 对于边(u,v),用dist(u)和(u,v)的和尝试更新dist(v): dist(v) = min(dist(v) , dist(u)+l(u,v) 注:dist(i)为源 ...
- [AcWing 823] 排列
点击查看代码 #include<iostream> using namespace std; const int N = 10; int n; void dfs(int u, int nu ...
- 1.7 Linux系统的优缺点
本节,我们介绍一下 Linux 系统的优缺点.Linux 不可比拟的优势如下. 1) 大量的可用软件及免费软件 Linux 系统上有着大量的可用软件,且绝大多数是免费的,比如声名赫赫的 Apache. ...
- 【面试普通人VS高手系列】说说缓存雪崩和缓存穿透的理解,以及如何避免?
听说10个人去互联网公司面试,有9个人会被问到缓存雪崩和缓存穿透的问题. 听说,这9个人里面,至少有8个人回答得不完整. 而这8个人里面,全都是在网上找的各种面试资料去应付的,并没有真正理解. 当然, ...
- C# Thread.Sleep 不精准的问题以及解决方案
1.问题 最近在写一个熔断的 SDK,其中一种策略是根据慢请求来进行熔断. 我们在测试的时候,在对应 API 里面采用了 Thread.Sleep(ms) 来模拟慢请求. 设置的慢请求阈值是 RT 1 ...
- 什么是Docker容器?(全面了解使用)
一:为什么需要Docker容器? 1.引入 1.1麻烦的环境部署 1.在软件开发中,最麻烦的事情之一就是环境配置.在正常情况下,如果要保证程序能运行,我们需要设置好操作系统,以及各种库和组件的安装. ...
- 143. Reorder List - LeetCode
Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前 ...
- unity---克隆/贴图/平移/旋转
克隆 GameObject clone =Instantiate(gameObject,new Vector3(10,10,10),Quaternion.identity); Destroy(clon ...