【kmp】 字符串最大周期
大侠住店
TimeLimit: 1 Second MemoryLimit: 32 Megabyte
Totalsubmit: 116 Accepted: 64
Description
有一天晚上,一位大侠打败了若干个武林高手,一时高兴就到一家客栈喝了很多酒,以至于烂醉如泥。最后大侠不得不在这个客栈休息,但是这个店里的老板是一个很迷信的人,他认为半夜住点的人可能是一些妖魔鬼怪的化身,因此这个时间他会很小心。同时他知道妖魔鬼怪不会算法。因此每当晚上有人住店的时候,他就会出一个问题问他们,如果答对就证明他不是妖魔鬼怪,就同意住店。如果答不对就可能是妖魔鬼怪,就不同意住店。今天他出了这样一个问题,给出一个字符串,找出这个字符串有多少个周期(最多)。现在大侠特别想住店休息,请你帮他解决这个问题。
Input
第一行是一个整数 t (t<=10),表示测试的组数。
接下来t行,每行一个字符串,长度小于10000.
Output
总共t行,第i行是一个整数,表示第i组的周期。
Sample Input
2
ababab
ababa
Sample Output
3
1
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- #define N 10002
- int next[N];
- char s[N];
- void get_next(int len)
- {
- int i = ;
- int j = -;
- next[] = -;
- while (i < len)
- {
- if (j == - || s[i] == s[j])
- {
- ++i;
- ++j;
- next[i] = j;
- }
- else j = next[j];
- }
- return ;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- int num;
- cin >> num;
- while (num--)
- {
- scanf("%s", s);
- int len=strlen(s);
- get_next(len);
- int t=len-next[len];
- if(len%t!=)cout << <<endl;
- else cout << len/t <<endl;
- }
- return ;
- }
poj 3461 ac代码如下
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int MAX=+;
- char a[MAX],b[];
- int next[MAX];
- void get_next(char *a){
- int i=-,j=,len=strlen(a);
- next[]=-;
- while(j<len){
- if(i == - || a[i] == a[j])
- {
- i++;
- j++;
- if(a[i] == a[j])
- next[j]=next[j];
- else next[j]=i;
- }
- else i=next[i];
- }
- return;
- }
- int KMP(char *a,char *b){
- get_next(a);
- int i=,j=,num=,lena=strlen(a),lenb=strlen(b);
- b[lenb]='#';
- while(j<=lenb){//不需要i<lena,要把b全部比较完
- if(i == - || a[i] == b[j])++i,++j;
- else{//
- if(i == lena)++num;//表示有一个a
- i=next[i];
- }
- }
- return num;
- }
- int main(){
- // freopen("in.txt","r",stdin);
- int n;
- cin>>n;
- while(n--){
- cin>>a>>b;
- cout<<KMP(a,b)<<endl;
- }
- return ;
- }
- 另一种模板:
- #include<stdio.h>
- #include <iostream>
- #include <memory.h>
- using namespace std;
- char A[],B[];
- int next[];
- void getnext()
- {
- int i,j;
- next[]=;
- for(i=,j=;B[i];i++)
- {
- while(j> && B[i]!=B[j])
- j=next[j-];
- if(B[i]==B[j])
- j++;
- next[i]=j;
- }
- }
- int KMP()
- {
- int i,j,ans;
- for(i=j=ans=;A[i];i++)
- {
- while(j> && A[i]!=B[j])
- j=next[j-];
- if(A[i]==B[j])
- {
- j++;
- if(!B[j])
- {
- j=next[j-];
- ans++;
- }
- }
- }
- return ans;
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%s%s",B,A);
- memset(next,,sizeof(next));
- getnext();
- printf("%d\n",KMP());
- }
- return ;
- }
【kmp】 字符串最大周期的更多相关文章
- bzoj5130 字符串的周期(kmp,最小表示法)
bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...
- poj2406(求字符串的周期,kmp算法next数组的应用)
题目链接:https://vjudge.net/problem/POJ-2406 题意:求出给定字符串的周期,和poj1961类似. 思路:直接利用next数组的定义即可,当没有周期时,周期即为1. ...
- KMP字符串模式匹配详解(zz)
刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN A_B_ ...
- KMP字符串模式匹配详解(转)
来自CSDN A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...
- BM和KMP字符串匹配算法学习
BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...
- KMP字符串模式匹配详解
KMP字符串模式匹配详解 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
- POJ--2406Power Strings+KMP求字符串最小周期
题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个 ...
- 【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP
题目描述 给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和. $n\le 12,m\le 10^9$ 题解 DFS+KMP 对 ...
- 【KMP求最小周期】POJ2406-Power Strings
[题意] 给出一个字符串,求出最小周期. [思路] 对KMP的next数组的理解与运用orz ①证明:如果最小周期不等于它本身,则前缀和后缀必定有交叉. 如果没有交叉,以当前的next[n]为最小周期 ...
随机推荐
- qml 中 使用 shader
使用绘制工具如Photoshop .Flash已经可以创建许多效果非常绚丽的图像.动画等. Qt/QML 的努力其实是在这些工具发展的后面, 因此很多效果在Qt中无法实现. 不得不佩服Qt小组的才智, ...
- jquery 固定导航
网页代码: <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> & ...
- POJ题目(转)
http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法: (1)枚举. (poj1753,poj29 ...
- 【转载】将python脚本打包成exe文件
exe文件也就是可以直接执行的文件.通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执 行,每次通过Win + R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd ...
- 关于echarts使用的各种问题
此文为作者辛苦编写,如有转发,请注明出处,谢谢 首先引入js文件,这是动态引入 <script src="http://echarts.baidu.com/build/dist/ech ...
- ios日期时间
//1.获取当前时间 -(NSString*)getCurrentTime { NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; ...
- Ubuntu iptalbes 保存配置
ubuntu 保存防火墙命令,iptables方式:1.iptables 配置好策略2.iptables-save > /etc/network/iptables.up.rules ,配置的策 ...
- C#中AES加密和解密
/// AES加密 /// </summary> /// <param name="inputdata">输入的数据</param> /// & ...
- 存储过程sql语句
select count(virtualacc) into v_count from T_ATMMONITOR WHERE virtualacc = v_number; 用于存储过程中,是把coun ...
- 局部内部类访问方法的参数和局部变量必须是final的
内部类的种类一共分为四种,我看其他几种内部类的时候思路都是很清晰的,然后我就碰到了这一条:"方法中的内部类可以访问外部类成员.对于方法的参数和局部变量,必须有final修饰才可以访问&quo ...