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, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

Input

Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

Output

For each s you should print the largest n such that s = a^n for some string a.

Sample Input

abcd
aaaa
ababab
.

Sample Output

1
4
3

题意:

对于字符串S=x+x+x+...,x=“   ”一段字符,我们定义x为S的循环节,现在要找S做多由多少个循环节组成。即找最小循环节。

比如S="abababab",则“ab”“abab”都是S的循环节,但x=“ab”是最小的,满足答案ans=8/2=4是最大的。

思路:

kmp:

此题关键在于求出最长循环节的长度,假设一个字符串长度为n,循环节长度为m,一定n是m的倍数,根据KMP算法Next数组的含义,假设一个字符串是由K个子串组成的,则字符串最后一个字符的Next数值一定是K-1个子串的长度,所以只需求出Next[n]后n-Next[n]就是可能的最长循环节,但是如果n-Next[n]不能整除n,则一定原字符串无循环,所以最后模判定一下就行了。

后缀数组:

见下一个题。

KMP解决最小循环节:

例如

ababab  next[6] = 4; 即

123456

ababab

ababab

1~4位  与3~6位是相同的

那么1,2位

就等于3、4位

3、4位就等于5、6位

……

所以 如果 能整除  也就循环到最后了;

如果不能整除  ,

就最后余下的几位不在循环内。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
using namespace std;
const int maxn=;
char c[maxn];
int Next[maxn],L;
void KMP()
{
Next[]=;
for(int i=,k=;i<=L;i++) {
while(k&&c[i]!=c[k+]) k=Next[k];
if(c[i]==c[k+]) k++;
Next[i]=k;
}
}
int main()
{
while(~scanf("%s",c+)){
if(c[]=='.') return ;
L=strlen(c+);
KMP();
if(L%(L-Next[L])==) printf("%d\n",L/(L-Next[L]));
else printf("1\n");
}
}

POJ2406Power Strings (最小循环节)(KMP||后缀数组)的更多相关文章

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

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

  2. POJ2406 kmp算法next数组-串的最小循环节/循环周期

    题目链接:http://poj.org/problem?id=2406 题目大意:问给出的字符串最多由多少个子串相乘得来的. 思路:利用next数组的含义来解. 1.一个串的最小循环节长度:len - ...

  3. KMP解决最小循环节问题

    # 10035. 「一本通 2.1 练习 1」Power Strings [题目描述] 给定若干个长度 $\le 10^6$​​ 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的.如 ...

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

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

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

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

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

    经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...

  7. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  8. [KMP求最小循环节][HDU3746][Cyclic Nacklace]

    题意 给你个字符串,问在字符串末尾还要添加几个字符,使得字符串循环2次以上. 解法 无论这个串是不是循环串 i-next[i] 都能求出它的最小循环节 代码: /* 思路:kmp+字符串的最小循环节问 ...

  9. [KMP求最小循环节][HDU1358][Period]

    题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...

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

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

随机推荐

  1. jquery实现全选、全消、反选功能

    HTML代码: <input type="checkbox" name="checkbox" class="A" /> 使用按钮 ...

  2. Java语言实现简单FTP软件------>连接管理模块的实现:主机与服务器之间的连接与关闭操作(八)

    (1)FTP连接 运行FTP客户端后,首先是连接FTP服务器,需要输入FTP服务器的IP地址及用户名.密码以及端口号后点击连接按钮开始连接FTP服务器,连接流程图如下图所示. 点击"连接&q ...

  3. Js格式化json字符串

    var formatJson = function(json, options) { var reg = null, formatted = '', pad = 0, PADDING = ' '; / ...

  4. apche安装教程

    从Apache官网下载windows安装版的Apache服务器了, 现在分享给大家.   1 进入apache服务器官网http://httpd.apache.org/,这里我们以下载稳定版的 htt ...

  5. 错误解决Error configuring application listener of class org.springframework.web.util.Log4jConfigListener(转发)

    Spring MVC-----maven项目导入后启动tomcat出现如下错误 参考:http://blog.csdn.net/itlionwoo/article/details/17523371 解 ...

  6. C#读取excel 找不到可安装的ISAM

    实在没有办法了 就仔细的查看了 一下数据链接字符串: string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" ...

  7. vs2008 发布网站时丢失文件问题

    右键指定的文件->属性, 将生成操作更改成为"内容"就可以了.

  8. [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 【Flask】查询分页问题处理

    遇到两次查询结果分页的问题, 查询出结果后, 翻页时导致查询条件失效. 处理方式 1. 路由中不放page参数 写成 @testfile.route("/test-file", m ...

  10. 跨平台(I版到K版)迁移实践总结

           所谓跨平台迁移,对于了解openstack冷迁移过程的同学来说,其实就是手动去执行冷迁移的代码行为,当然像我这种抵制体力劳动的人,肯定会想写脚本去跑,即使不会也要边学边用. 迁移并非想象 ...