UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)

题意:定义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

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define pii pair<int,int>
 4 #define INF 0x7f7f7f7f
 5 using namespace std;
 6 const int N=1000010;
 7
 8 char qstr[N];
 9 int qnext[N];
10
11 void get_next(int len)
12 {
13     qnext[0]=-1;
14     int i=0;
15     int j=-1;   //模式串
16     while(i<len)
17     {
18         if(j==-1||qstr[j]==qstr[i])   qnext[++i]=++j;
19         else    j=qnext[j];
20     }
21 }
22
23 int main()
24 {
25     freopen("input.txt", "r", stdin);
26     while(scanf("%s",qstr),qstr[0]!=‘.‘)
27     {
28         int len=0;
29         get_next(len=strlen(qstr));
30
31         int ans=len%(len-qnext[len])==0?len/(len-qnext[len]):1;
32         printf("%d\n",ans);
33     }
34     return 0;
35 }

AC代码

时间: 2024-10-05 10:36:05

UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)的相关文章

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

Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiati

UVA 10298 - Power Strings(KMP)

UVA 10298 - Power Strings 题目链接 题意:本意其实就是,给定一个字符串,求出最小循环节需要几次循环出原字符串 思路:利用KMP中next数组的性质,n - next[n]就是最小循环节,然后n / 循环节就是答案 代码: #include <cstdio> #include <cstring> const int N = 1000005; char str[N]; int next[N]; void getnext() { int n = strlen(s

UVa 10298 - Power Strings

题目:求一个串的最大的循环次数. 分析:dp,KMP,字符串.这里利用KMP算法. KMP的next函数是跳跃到最近的串的递归结构位置(串元素取值0 ~ len-1): 由KMP过程可知: 如果存在循环节,则S[0 ~ next[len]-1] 与 S[len-next[len] ~ len-1]相匹配: 则S[next[len] ~ len-1]就是循环节(且最小),否则next[len]为0: 因此,最大循环次数为len/(len-next[len]),最小循环节为S[next[len] ~

(Incomplete) UVa 10298 Power Strings

方法:暴力 / kmp 先说一下暴力的方法,就是尝试把原来的string不断分割,在substring 里求解.code 如下 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <string> #include <vector> #include <stack> #include <bitse

Light OJ 1268 Unlucky Strings 矩阵快速幂+KMP

题目来源:Light OJ 1268 Unlucky Strings 题意:给你一些可以用的字符 然后求组成不包含给定字符串的方案数 思路:矩阵经典问题 从i走k步路到达j的方案数 可以用矩阵快速幂求解 对于求长度为n的字符的方案数 就是走n步路 求走法 可以用KMP求出走一步 从前i个字符到前j个字符的方案数 这点有点不好理解 想一想 #include <cstdio> #include <cstring> #include <algorithm> #include

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

Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少次得到. analyse: KMP之next数组的运用.裸的求最小循环节. Time complexity: O(N) Source code:  /** this code is made by crazyacking* Verdict: Accepted* Submission Date: 20

KMP解决字符串最小循环节相关问题

经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个结论 如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串循环,而且 循环节长度为:    i - next[i] 循环次数为:       i / ( i - next[i] ) 水平有限,用自己的语言描述怕

HDOJ3374 String Problem [KMP最小循环节点]+[最小(大)表示法]

String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1442    Accepted Submission(s): 645 Problem Description Give you a string with length N, you can generate N strings by left shifts

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of