hdu 1686 & poj 2406 & poj 2752 (KMP入门三弹连发)
首先第一题
戳我穿越;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入门三弹连发)的更多相关文章
- 题解报告:hdu 2087 剪花布条(KMP入门)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面 ...
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
http://poj.org/problem?id=2406 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submiss ...
- POJ 2406 - Power Strings - [KMP求最小循环节]
题目链接:http://poj.org/problem?id=2406 Time Limit: 3000MS Memory Limit: 65536K Description Given two st ...
- POJ 2406 Power Strings KMP求周期
传送门 http://poj.org/problem?id=2406 题目就是求循环了几次. 记得如果每循环输出为1.... #include<cstdio> #include<cs ...
- POJ 2406 Power Strings (KMP)
Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...
- POJ 2406 Power Strings KMP算法之next数组的应用
题意:给一个字符串,求该串最多由多少个相同的子串相接而成. 思路:只要做过poj 1961之后,这道题就很简单了.poj 1961 详细题解传送门. 假设字符串的长度为len,如果 len % (le ...
- poj 2406 Power Strings kmp算法
点击打开链接 Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27368 Accepted: ...
- POJ 2406 Power Strings KMP运用题解
本题是计算一个字符串能完整分成多少一模一样的子字符串. 原来是使用KMP的next数组计算出来的,一直都认为是能够利用next数组的.可是自己想了非常久没能这么简洁地总结出来,也仅仅能查查他人代码才恍 ...
- poj 2406 Power Srings (kmp循环节) (经典)
<题目链接> 题目大意: 给出一个字符串,求其字串在该字符串中循环的最大周期. 解题分析: length=len-Next[len],len为该字符串的最小循环节,如果len%length ...
随机推荐
- C# windows服务:通过cmd命令安装、卸载、启动和停止Windows Service(InstallUtil.exe)
步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行里定位到InstallUtil.exe所在的位置 InstallUtil.exe 默认的安装位置是在C:/Windows/Microsoft ...
- android开源项目框架大全:
android开源项目框架大全: 1.多页切换TabHost9 高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的,实现方式 ...
- hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)
Deciphering Password Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- JAVA语言 第二周
放假第二周了,时间真快! 上一周配置好了环境变量,这一周就可以做一些测试了.对不同的内容分类进行了测试,包括写入.输出.变量·······还有很多.对于开学的试卷,在第一部分做的还行,第二部分就没什么 ...
- jekins的一些配置
GotPC_Excel_Branches丢弃旧的构建 svn http://devsvn.uuzuonline.com/GOT_PC_PRIVATE/config/trunk构建Execute she ...
- 04_web基础(七)之jsp
39.jsp与el表达式引入 JSP:Java Server Pages:Java的服务网页(Java动态网页):=========================================== ...
- iostat磁盘监控工具
安装iostat磁盘监控工具 1.安装 yum install sysstat 2.运行 iostat -k -d -x 1 10 -k:以kb为单位统计 -d:显示磁盘状态 -x:显示详细信息 1: ...
- 测试工具之appcrawler的使用
appcrawler 标签(空格分隔): appcrawler appcrawler 简介 一个基于自动遍历的app爬虫工具. 支持android和iOS, 支持真机和模拟器. 最大的特点是灵活性. ...
- HTML5 WebSocket 权威指南 学习一 (第二章 WebSocket API)
WebSocket 协议两种URL方案 ws 客户端和服务器之间的非加密流量 wss 客户端和服务器之间的加密流量 WebSocket Secure 表示使用传输层安全性(SSL)的WebSocket ...
- 使用html中的<input>标签上传多个文件(转)
如何使用html上传多个文件呢?我搜索中文怎么也找不到合适的,都是用js动态添加input,然后提交,不能满足我想要的——打开选择文件的窗口后可以一次性选择多个文件. 然后我尝试搜索英文"h ...