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 ...
随机推荐
- arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上
前言 之前看了官方玩过一个智能猫眼摄像头,我很有兴趣,但是那个 IDF 平台属实难整,我光安装都整了一天,网不好下载的包可能有问题.然后命令行操作也比较麻烦,我就想到了无敌的 arduino ,ESP ...
- Python抽象基类:ABC谢谢你,因为有你,温暖了四季!
Python抽象基类:ABC谢谢你,因为有你,温暖了四季! Python抽象基类:ABC谢谢你,因为有你,温暖了四季! 实例方法.类方法和静态方法 抽象类 具名元组 参考资料 最近阅读了<Pyt ...
- 封装axios在项目中使用
import store from '@/store/index' import { Loading,Message,MessageBox } from 'element-ui' import rou ...
- Linux 环境变量配置的 6 种方法,建议收藏
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux环境变量配置 在自定义安装软件的时候,经常需要配置环境变量,下面列举出各种对环境变量 ...
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- 【hexo博客搭建】本地搭建hexo博客(上)
前言 本篇文章会从本地(Windows 10)搭建-主题更换-部署阿里云详细步骤,如果在搭建过程中,遇到问题,可以通过博客页脚下的QQ联系我,或者在下面评论留言 一.本地搭建 1.安装前置 1.1安装 ...
- 记一次百万行WPF项目代码的重构记录
此前带领小组成员主导过一个百万行代码上位机项目的重构工作,分析项目中存在的问题做了些针对性的优化,整个重构工作持续了一年半之久. 主要针对以下问题: 1.产品型号太多导致代码工程的分支太多,维护时会产 ...
- ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例
在 确定分布策略 中, 我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序. http:/ ...
- 解决windows server 2008r2服务器自动关机
问题 具体表现就是系统自动关机,网上说是开机后2小时就会自动关机 系统版本: 解决 PsTools下载 解压:PSTools.zipg,如解压到C:\PSTools目录下 执行如下命令,打开注册表 W ...
- 用 notion 管理信用卡与花呗
用 notion 管理信用卡与花呗 Notion原文,排版更佳 概述 不需要提醒功能和安卓用户可以忽略Scriptable和快捷指令 app的设置 Notion 建立信用卡表格,录入信用卡基本信息,自 ...