首先第一题

戳我穿越;http://acm.hdu.edu.cn/showproblem.php?pid=1686

题目大意好理解,每组输入一个子串和一个母串,问在母串中有多少个子串?

文明人不要暴力,因为宽度会超时,除去暴力后这就是赤果果的KMP

KMP的重点在于在子串中建立一个匹配表,记录 到每一位的 前缀后缀 中的相同的子子串的最大长度

然后在比较子母串的时候当遇到不同时 后移的位数就是前面相同的个数减去对应的匹配表例的数

额 讲的不清不楚 那推荐戳这里:http://kb.cnblogs.com/page/176818/

那这题就是个裸的KMP模板

code 还是很简单的

#include<cstdio>
#include<cstring>
using namespace std;
char cword[10001];
int num[10001];
char mword[1000001];
int main()
{
int t,sum,i,x,j,y;
char temp;
while (~scanf("%d",&t))
{
while (t--)
{
sum=0;
j=-1;i=0;
num[0]=-1;
scanf("%s",cword);
scanf("%s",mword);
x=strlen(cword);
y=strlen(mword);
while (i<x) //num数组就是用来储存匹配表
{
if (j==-1||cword[i]==cword[j])
{
j++;
i++;
if (cword[i]!=cword[j])
num[i]=j;
else
num[i]=num[j];
}
else
j=num[j];
}
i=0;j=0;
while (i<y)
{
if (j==-1||mword[i]==cword[j])
{
i++;
j++;
}
else
j=num[j];
if (j==x)
{
sum++;
j=num[j];
}
}
printf("%d\n",sum);
}
}
return 0;
}

第二题 :pid=124http://acm.hdu.edu.cn/showproblem.php?7

输出一个单词里最多是由多少个子串重复连接而成 注意 是重复 连接 而成,如abefab因为ab没有连接,所以应该输出1

也是kmp的应用,考虑有特殊情况

code更短

#include<cstdio>
#include<cstring>
using namespace std;
char yj[1000001];
int jjc[1000001];
int main()
{
int i,j,x,n;
while (~scanf("%s",yj))
{
if (yj[0]=='.')
break;
j=-1;
jjc[0]=-1;
x=strlen(yj);
for (i=0;i<x;)
{
if (j==-1||yj[i]==yj[j]) jjc[++i]=++j;
else j=jjc[j];
}
if (x%(x-jjc[x])==0)
printf("%d\n",x/(x-jjc[x]));
else
printf("1\n");
}
return 0;
}

第三题:http://poj.org/problem?id=2752

就是找出一行名字中在前缀后缀中都存在的字串的长度,升序输出

对num数组匹配表的运用,既然在前缀后缀中都存在,那么其字串的最后一个字母必定和整个串的最后一位相同

然后再利用num数组一直向下滚一边

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char yj[400001];
int num[400001];
int jjc[400001];
int main()
{
int i,j,x,t,k;
while (~scanf("%s",yj))
{
j=-1;i=0;
num[0]=-1;
x=strlen(yj);
while (i<x)
{
if (j==-1||yj[i]==yj[j])
num[++i]=++j;
else
j=num[j];
}
t=num[x-1];
k=0;
while (t!=-1)
{
if (yj[t]==yj[x-1])
jjc[k++]=t+1;
t=num[t];
}
for (i=k-1;i>=0;i--)
printf("%d ",jjc[i]);
printf("%d\n",x);
}
return 0;
}

  

  

hdu 1686 & poj 2406 & poj 2752 (KMP入门三弹连发)的更多相关文章

  1. 题解报告:hdu 2087 剪花布条(KMP入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面 ...

  2. poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)

    http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submiss ...

  3. POJ 2406 - Power Strings - [KMP求最小循环节]

    题目链接:http://poj.org/problem?id=2406 Time Limit: 3000MS Memory Limit: 65536K Description Given two st ...

  4. POJ 2406 Power Strings KMP求周期

    传送门 http://poj.org/problem?id=2406 题目就是求循环了几次. 记得如果每循环输出为1.... #include<cstdio> #include<cs ...

  5. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  6. POJ 2406 Power Strings KMP算法之next数组的应用

    题意:给一个字符串,求该串最多由多少个相同的子串相接而成. 思路:只要做过poj 1961之后,这道题就很简单了.poj 1961 详细题解传送门. 假设字符串的长度为len,如果 len % (le ...

  7. poj 2406 Power Strings kmp算法

    点击打开链接 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27368   Accepted:  ...

  8. POJ 2406 Power Strings KMP运用题解

    本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都认为是能够利用next数组的.可是自己想了非常久没能这么简洁地总结出来,也仅仅能查查他人代码才恍 ...

  9. poj 2406 Power Srings (kmp循环节) (经典)

    <题目链接> 题目大意: 给出一个字符串,求其字串在该字符串中循环的最大周期. 解题分析: length=len-Next[len],len为该字符串的最小循环节,如果len%length ...

随机推荐

  1. css3文本和颜色

    1.文本阴影text-shadow 语法 text-shadow:X-Offset Y-Offset blur color; X-Offset:表示阴影的水平偏移距离,其值为正值时阴影向右偏移,反之向 ...

  2. java-学习4

    一.八大数据类型—dataType 整型 1)byte 2)short 3)int 4)long 浮点型 5)float 6)double 字符型 7)char 布尔型 8)boolean 二.变量和 ...

  3. spring .cloud ------------java.lang.RuntimeException: com.netflix.client.ClientException,Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters

    1.问题的发生 Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connect ...

  4. surf特征点检测

    ※注:参数SURF中的hessian阈值是图像Hessian矩阵判别式的阈值,值越大检测出的特征点就越少,也就意味着特征点越稳定 #include "opencv2/core/core.hp ...

  5. Python 图示集绵

    http://nbviewer.jupyter.org/github/pyecharts/pyecharts-users-cases/blob/master/notebook-users-cases/ ...

  6. Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

    https://www.jianshu.com/p/fd3d49c7f1f8 通过Android Studio 的Sdk Manager安装NDK,安装完之后编译失败,报错信息如下: Error:No ...

  7. 1.5.6、CDH 搭建Hadoop在安装之前(定制安装解决方案---使用Cloudera Manager模板创建CDH群集)

    使用Cloudera Manager模板创建CDH群集 您可以通过从Cloudera Manager管理的现有CDH群集导出群集模板来创建新的CDH群集.然后,您可以修改模板并使用它在新的主机集上创建 ...

  8. Linux 永久PATH环境变量

    在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用vim在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”. 例如:编辑/etc ...

  9. pta l2-13(红色警报)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208 题意:给n个顶点,m条边,问每次删 ...

  10. 江西财经大学第一届程序设计竞赛 H题 求大数的阶乘

    链接:https://www.nowcoder.com/acm/contest/115/H 来源:牛客网 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所学的知识 ...