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 ...
随机推荐
- Mysql、Oracle锁表处理
MySql解锁方式 1 # 1. 查看当前数据库锁表的情况 2 SELECT * FROM information_schema.INNODB_TRX; 3 # 2. 杀掉查询结果中锁表的trx_my ...
- 2021.08.01 P4311 数字序列(左偏树)
2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...
- Elemnt ui 组件封装(form)
<template> <el-form class="form" :inline="formConfig.inline" :model=&qu ...
- 操作系统深度研究(75页PPT)
上一篇:命令行版的斗地主你玩过没? 内容覆盖操作系统基本概念.分类.关键技术,体系架构,发展历程和主流国产操作系统厂商分析. 文中报告节选自兴业证券经济与金融研究院已公开发布研究报告,具体报告内容及相 ...
- 三大特性,多个场景,Serverless 应用引擎 SAE 全面升级
作者:营火 微服务能力大提升,更新增 Job.PHP 等场景,延展 Serverless 新边界 点击此处,获得阿里云 SAE 发布会直播 PPT! 企业的数字化随着互联网的普及发展越来越快,技术架构 ...
- for循环+数字类型补充
一.for循环 1.循环取值 1.1列表类型: 定义l=['a','b','c'],要提取列表中的值 如果采用while循环的话: print(len(l)) i=0 while i& ...
- 8┃音视频直播系统之 WebRTC 信令系统实现以及通讯核心并实现视频通话
一.信令系统 信令系统主要用来进行信令的交换 在通信双方彼此连接.传输媒体数据之前,它们要通过信令服务器交换一些信息,如规范协商 若 A 与 B 要进行音视频通信,那么 A 要知道 B 已经上线了,同 ...
- (原创)[C#] MEF 主程序与插件加载不同版本的DLL
一.前言 MEF(Managed Extensibility Framework),是轻量级的插件框架.使用简单,功能强大.详细介绍见MSDN,本文不再赘述. 在使用MEF时,会遇到这样一种场景: 主 ...
- 好客租房42-react组件基础综合案例-渲染列表无数据并优化
渲染列表评论 1判断列表数据的长度是否为0 2如果为0 则渲染暂无评论 //导入react import React from 'react' import ReactDOM from 'react- ...
- Java面试宝典学习笔记【2020】
Java面试题总结 一.Java基础 1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能.Java保留了这个关键字但是没有使用 ...