题意:

  定义a为一个字符串,a*a表示两个字符相连,即 an+1=a*a,也就是出现循环了。给定一个字符串,若将其表示成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,最小循环节)的更多相关文章

  1. HDU 1358 Period(KMP+最小循环节)题解

    思路: 这里只要注意一点,就是失配值和前后缀匹配值的区别,不懂的可以看看这里,这题因为对子串也要判定,所以用前后缀匹配值,其他的按照最小循环节做 代码: #include<iostream> ...

  2. HDU 3746 Cyclic Nacklace(KMP+最小循环节)题解

    思路: 最小循环节的解释在这里,有人证明了那么就很好计算了 之前对KMP了解不是很深啊,就很容易做错,特别是对fail的理解 注意一下这里getFail的不同含义 代码: #include<io ...

  3. UVA - 10298 Power Strings (KMP求字符串循环节)

    Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenati ...

  4. UVa 10298 - Power Strings

    题目:求一个串的最大的循环次数. 分析:dp.KMP,字符串.这里利用KMP算法. KMP的next函数是跳跃到近期的串的递归结构位置(串元素取值0 ~ len-1): 由KMP过程可知: 假设存在循 ...

  5. - Power Strings (字符串哈希) (KMP)

    https://www.cnblogs.com/widsom/p/8058358.htm (详细解释) //#include<bits/stdc++.h> #include<vect ...

  6. KMP + 求最小循环节 --- POJ 2406 Power Strings

    Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少 ...

  7. poj 2406 Power Strings【字符串+最小循环节的个数】

                                                                                                      Po ...

  8. POJ2406Power Strings (最小循环节)(KMP||后缀数组)

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  9. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

随机推荐

  1. js--eval函数

    前言: js的eval函数很牛叉,用了几次--不过都没有记录.试想:如果没有EXT.JQery,怎样将json字符串转换为对象呢? 示例: 定义2个字符串变量s1.s2.其中s1表示一个对象:s2表示 ...

  2. 【POJ】【3537】Crosses and Crosses

    博弈论 相当于放了x的位置,左右4格都不能再放x了,谁无处可放就输. n<=2000 直接枚举后继状态,暴力求SG函数即可. 例: 0000000->x..0000 / .x..000 / ...

  3. Introduction to Deep Neural Networks

    Introduction to Deep Neural Networks Neural networks are a set of algorithms, modeled loosely after ...

  4. 原码 & 反码 & 补码 & 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  5. PHP ServerPush

    原文:http://yorsal.com/archives/302 随着人们对Web即时应用需求的不断上升,Server Push(推送)技术在聊天.消息提醒尤其是社交网络等方面开始兴起,成为实时应用 ...

  6. java调用dll文件中的类型转换

    char *转String   (env)->NewStringUTF("the content you want to type in"); char *转jbyteArr ...

  7. 因SELinux引起的用户登录问题解决案例

    增强安全性带来的负作用往往是牺牲便利性,就像北京地铁的安检一样,但有些时候我们确实需要它.   案例是,用户有一台安装了KylinOS(国产麒麟,使用的是redhat的内核)的系统,当我们对其系统文件 ...

  8. DevOps 和技术债务偿还自动化

    当企业想要迁移到一个 DevOps 模型时,经常需要偿还高等级的技术债务 说得更明确一点,机构往往陷入「技术债务的恶性循环」中,以至于任何迅速.敏捷的迁移方式都无法使用.这是技术债务中的希腊债务危机水 ...

  9. hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)

    题目 最早不会写,看了网上的分析,然后终于想明白了矩阵是怎么出来的了,哈哈哈哈. 因为边上的项目排列顺序不一样,所以写出来的矩阵形式也可能不一样,但是都是可以的 //愚钝的我不会写这题,然后百度了,照 ...

  10. jQuery经典面试题及答案精选[转载]

    问题:jQuery的美元符号$有什么作用? 回答:其实美元符号$只是”jQuery”的别名,它是jQuery的选择器,如下代码: $(document).ready(function(){ }); 当 ...