大侠住店

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】 字符串最大周期的更多相关文章

  1. bzoj5130 字符串的周期(kmp,最小表示法)

    bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...

  2. poj2406(求字符串的周期,kmp算法next数组的应用)

    题目链接:https://vjudge.net/problem/POJ-2406 题意:求出给定字符串的周期,和poj1961类似. 思路:直接利用next数组的定义即可,当没有周期时,周期即为1. ...

  3. KMP字符串模式匹配详解(zz)

    刚看到位兄弟也贴了份KMP算法说明,但本人觉得说的不是很详细,当初我在看这个算法的时候也看的头晕昏昏的,我贴的这份也是网上找的.且听详细分解: KMP字符串模式匹配详解 来自CSDN     A_B_ ...

  4. KMP字符串模式匹配详解(转)

    来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...

  5. BM和KMP字符串匹配算法学习

    BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...

  6. KMP字符串模式匹配详解

    KMP字符串模式匹配详解 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

  7. POJ--2406Power Strings+KMP求字符串最小周期

    题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个 ...

  8. 【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP

    题目描述 给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和. $n\le 12,m\le 10^9$ 题解 DFS+KMP 对 ...

  9. 【KMP求最小周期】POJ2406-Power Strings

    [题意] 给出一个字符串,求出最小周期. [思路] 对KMP的next数组的理解与运用orz ①证明:如果最小周期不等于它本身,则前缀和后缀必定有交叉. 如果没有交叉,以当前的next[n]为最小周期 ...

随机推荐

  1. JS复习:第三章&第四章

    第三章 一.把一个值转换成字符串的两种方法: 1.使用每个值都有的toString( )方法.这个方法唯一要做的就是返回相应值的字符串表现.例如: var age = 11 ; var ageAsSt ...

  2. (转)了解JNDI

    JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...

  3. Gitlab命令行指令

    Git global setup git config --global user.name "lh" git config --global user.email "l ...

  4. MVC3+EF4.1学习系列(七)-----EF并发的处理

    看这篇文章之前 推荐园子里的 这个文章已经有介绍了 而且写的很好~~ 可以先看下他的 再看我的 并发 1.悲观并发 简单的说 就是一个用户访问一条数据时 则把这个数据变为只读属性  把该数据变为独占 ...

  5. 好友与组--ESFramework 4.0 进阶(11)

    大部分分布式通信系统中,都会涉及到客户端之间相互通信.以及需要将客户端进行分组的功能,或者是类似这方面的需求.ESFramework对这一常见的任务内置了强大的支持,包括从客户端到服务端.一直到Pla ...

  6. UVALive 6948 Jokewithpermutation 深搜

    题意就是把一段序列拆成从1到n的形式 一开始暴力了一下 后来发现bug太多一定是思路不对…… #include<stdio.h> #include<iostream> #inc ...

  7. digitalocean网站打不开,大陆无法正常访问怎么办?

    在中国大陆,由于某些恶心的原因,digitalocean官方网站经常出现无法打开,或者打开后网页异常的情况,如果你是一个新注册用户,你甚至会被吓到,一个全球知名的vps主机商网站可能是这样的: 我的天 ...

  8. VS中调试时监控线程的最后错误代码

    进行调试的时候,监控线程的最后错误代码是非常有用的. 在 Microsoft Visual studio 中,Microsoft 的调试程序支持一个非常有用的特性,即可以配置 Watch 窗口,以便始 ...

  9. 重拾Ruby—新的征程

    作家格拉德威尔在<异类>一书中指出: “人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力.1万小时的锤炼是任何人从平凡变成超凡的必要条件.“ 他将此称为“一万小时定 ...

  10. 关于erlang的binary

    引自:http://cryolite.iteye.com/blog/1547252 1. binary数据是可以在不同进程间共享的 当然这些进程都在同一Erlang节点上. 这与普通term不同,后者 ...