UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
题意:
定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*an ,也就是出现循环了。给定一个字符串,若将其表示成an,问n最大为多少?
思路:
如果完全不循环,顶多就是类似于abc1这样,即n=1。但是如果循环出现了,比如abab,那就可以表示成(ab)2。还有一点,就是要使得n尽量大,那么当出现abababab时,应该要这么表示(ab)4,而不是(abab)2。
此题用神奇的KMP解决,也就是主要利用next数组。举例说明。
一般出现循环的都会大概是这样的:abcabcabc。而这样是没有出现循环的:ababa,5个数字,质数,怎样都不会循环啦。那么下面就拿abcabcabc来举例。
abcabcabc的next数组表示成:
next[0~9]={-1,0,0,0,1,2,3,4,5,6}对吧?但是我们通常用的只是next[0~8]而已,现在next[9]派上用场了。here comes.....
若len%(len-next[len])==0,则最小循环节为len/(len-next[len]),否则为1。为虾米?
首先是,这两小段是匹配的,对吧?根据next数组都能看出来啦。
abcabcabc
abcabcabc
接着,因为次串next[9]=6,那么len-next[9]=3,也就是说串头还剩下3个字符,说的就是"abc"。如果喔,len%(len-next[len])=9%(9-6)=9%3=0呢,最小循环节浮现了,就是串头"abc",又为虾米? 拆串来看看呗:
abc abc abc
我将他们3个子串分别命名为A和B和C。
既然next[9]说明了s[9]的前面居然有6个和串头匹配,那么AB=BC,自然B=A啦(再看next去)。也就是说如果除了串头A,剩下的字符BC都能够是A的个数的倍数,这事就成了。只要不是倍数,那么就没什么循环的可能了。
A刚好3个字符,后面的BC加起来是6个,刚好是3的倍数,会循环。
可以搭配这篇文章继续看:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=; char qstr[N];
int qnext[N]; void get_next(int len)
{
qnext[]=-;
int i=;
int j=-; //模式串
while(i<len)
{
if(j==-||qstr[j]==qstr[i]) qnext[++i]=++j;
else j=qnext[j];
}
} int main()
{
freopen("input.txt", "r", stdin);
while(scanf("%s",qstr),qstr[]!='.')
{
int len=;
get_next(len=strlen(qstr)); int ans=len%(len-qnext[len])==?len/(len-qnext[len]):;
printf("%d\n",ans);
}
return ;
}
AC代码
UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)的更多相关文章
- HDU 1358 Period(KMP+最小循环节)题解
思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> ...
- HDU 3746 Cyclic Nacklace(KMP+最小循环节)题解
思路: 最小循环节的解释在这里,有人证明了那么就很好计算了 之前对KMP了解不是很深啊,就很容易做错,特别是对fail的理解 注意一下这里getFail的不同含义 代码: #include<io ...
- UVA - 10298 Power Strings (KMP求字符串循环节)
Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...
- UVa 10298 - Power Strings
题目:求一个串的最大的循环次数. 分析:dp.KMP,字符串.这里利用KMP算法. KMP的next函数是跳跃到近期的串的递归结构位置(串元素取值0 ~ len-1): 由KMP过程可知: 假设存在循 ...
- - Power Strings (字符串哈希) (KMP)
https://www.cnblogs.com/widsom/p/8058358.htm (详细解释) //#include<bits/stdc++.h> #include<vect ...
- KMP + 求最小循环节 --- POJ 2406 Power Strings
Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少 ...
- poj 2406 Power Strings【字符串+最小循环节的个数】
Po ...
- POJ2406Power Strings (最小循环节)(KMP||后缀数组)
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
随机推荐
- C#快速排序算法基础入门篇
相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...
- Maven搭建webService (二) 创建服务端---使用web方式发布服务
今天和大家分享 使用 web方式发布 webService 服务端.客户端 1.首先创建 一个web工程(增加Maven依赖) 2.增加Maven依赖包,如下: <!-- spring core ...
- 基于Pre-Train的CNN模型的图像分类实验
基于Pre-Train的CNN模型的图像分类实验 MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “im ...
- PE文件结构详解(三)PE导出表
上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...
- web系统之session劫持解决
session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持 可能. 两台主机要想进行TCP通信,必须经过一个三 ...
- XEE介绍
摘要: XMl Entity Expansion(攻击)某种程度上类似于 XML Entity Expansion,但是它主要试图通过消耗目标程序的服务器环境来进行DOS攻击的.这种攻击基于XML E ...
- POJ2752 Seek the Name,Seek the Fame KMP算法
KMP继续练手.题目问的是一个串前缀等于后缀的可能长度是哪些,输出来.题目考的是对KMP失配指针的理解,当最后一位失配(即'\0'那里)时,指针会移动到前缀对应匹配的部分,所以这个长度是我们要的,然后 ...
- java基础知识回顾之---java String final类之intern方法
public class StringObjectDemo { /** * @param args */ public static void main(String[] args) { String ...
- .NET framework 4.0安装失败怎么办
开始——运行——输入cmd——回车——在打开的窗口中输入net stop WuAuServ 开始——运行——输入%windir%找到有个叫SoftwareDistribution的文件夹,把它重命 ...
- Java实现二维码QRCode的编码和解码
涉及到的一些主要类库,方便大家下载: 编码lib:Qrcode_swetake.jar (官网介绍-- http://www.swetake.com/qr/index-e.html) 解码lib: ...