ACM - KMP题目小结 (更新中)
KMP算法题型大致有两类,一类是next数组的应用,一类是匹配问题。
next数组大多数是求字符串周期,或者是与前缀后缀有关,也可以应用在DP中。需要对next数组有一定理解才能做得出。
next数组有一些性质。L为字符串长度。
如,L%(L-next[L])==0,说明字符串S[0,L-next[L]]是重复子串。
周期串/求循环节:
HDU 1358 Period
http://acm.hdu.edu.cn/showproblem.php?pid=1358
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define MAXN 1000005
using namespace std;
int next[MAXN];
char str[MAXN];
void getFail()
{
; str[i]; ++i)
{
int j=next[i];
while(j&&str[i]!=str[j]) j=next[j];
next[i+]=(str[i]==str[j])?j+:;
}
}
int main()
{
;
while(scanf("%d",&n)&&n)
{
scanf("%s",str);
getFail();
printf("Test case #%d\n",++kase);
; i<=n; ++i)
{
int k=i-next[i];
&&i/k!=) printf("%d %d\n",i,i/k);
}
printf("\n");
}
;
}
HDU 3746 Cyclic Nacklace
http://acm.hdu.edu.cn/showproblem.php?pid=3746
POJ 2406 Power Strings
http://poj.org/problem?id=2406
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
];
];
void getFail()
{
; str[i]; ++i)
{
int j=next[i];
while(j&&str[i]!=str[j]) j=next[j];
next[i+]=(str[i]==str[j])?j+:;
}
}
int main()
{
]!='.')
{
getFail();
int L=strlen(str);
int p=L-next[L];
) printf("%d\n",L/p);
);
}
;
}
前缀/后缀:
POJ 2752 Seek the Name, Seek the Fame
http://poj.org/problem?id=2752
HDU 2594 Simpsons’ Hidden Talents
http://acm.hdu.edu.cn/showproblem.php?pid=2594
HDU 4300 Clairewd’s message
http://acm.hdu.edu.cn/showproblem.php?pid=4300
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<string>
#include<cstring>
using namespace std;
],lenb;
map<char,char> has;
string str,a,b,s;
//char has[30];
void getFail()
{
; i<str.size(); ++i)
{
int j=next[i];
while(j&&str[i]!=str[j]) j=next[j];
next[i+]=(str[i]==str[j])?j+:;
}
}
string ans;
void Find(int p)
{
while(!(next[p]<=(lenb-next[p]))) p=next[p];
ans.clear();
; i<a.size(); ++i) ans+=a[i];
for(int i=next[p]; i<lenb-next[p]; ++i) ans+=b[i];
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>s>>a;
b.clear();
has.clear();
; i<s.size(); ++i)
has[s[i]]=i+'a';
; i<a.size(); ++i)
b+=has[a[i]];
str=b+a;
lenb=b.size();
getFail();
Find(str.size());
cout<<ans<<endl;
}
;
}
其他:
HDU 3336 Count the string
http://acm.hdu.edu.cn/showproblem.php?pid=3336
字符串匹配问题主要有匹配单个模版串,寻找公共子串。难的是它的应用。
单串匹配:问一个字符串在另一个字符串里出现了多少次。
HDU 2087 剪花布条 (不能重叠)
http://acm.hdu.edu.cn/showproblem.php?pid=2087
POJ 3461 Oulipo (可以重叠)
http://poj.org/problem?id=3461
二维匹配:
POJ 2185 Milking Grid
http://poj.org/problem?id=2185
需要降维后再使用KMP。
公共子串:此类问题大多数是KMP+暴力枚举
POJ 3080 Blue Jeans
http://poj.org/problem?id=3080
POJ 3450 Corporate Identity
http://poj.org/problem?id=3450
其它:
待补充。。。
ACM - KMP题目小结 (更新中)的更多相关文章
- ACM -二分图题目小结
暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063 过 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- js坑爹笔试题目汇总(持续更新中)
把你的面试官问倒,你就是一个合格的面试者了,以下总结一些易错的js笔试题目,会持续更新中.欢迎关注 1,考察this var length = 10 function fn(){ alert(this ...
- Android开发面试经——4.常见Android进阶笔试题(更新中...)
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- 【小TIP】记录各种错误【更新中】
最好程序一遍通过,为了提高代码能力,这里将用TIP的形式记录来犯过的错误.不断更新中. *已经转移到闪存.. [150214]WA:检查是否数组开小了. [150212]WA:如果程序中有乘号,需要留 ...
- 404boom 博客闪现【不断的优化更新中。。。】
404boom 博客闪现[不断的优化更新中...] 停止本篇博文EQ继续优化,所有博文将会在标签[cnblogs_v2 ]中重新整理,待完成统一放上链接 一:Java SE相关1.Java的概述2.J ...
- 史上最全的spark面试题——持续更新中
史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题 版权声明:本文为博主原创文章,遵循C ...
- 2020年腾讯实习生C++面试题&持续更新中(2)
2020年腾讯实习生C++面试题&持续更新中(2) hello,大家好~ 我是好好学习天天,天天编程的天天,一个每天都死磕技术,及时分享的技术宅~ 昨天分享的题目不知道大家是否看过了,以后我计 ...
- 2020年腾讯实习生C++面试题&持续更新中(1)
2020年腾讯实习生C++面试题&持续更新中(1) 腾讯面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的 ...
随机推荐
- EL表达式 (详解)(转)
EL表达式 1.EL简介 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一 ...
- SSH2 架构常用注解
1. @Repository 将 DAO 类声明为 Bean 2.@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次. 3.@Service 通常作用在业务层 ...
- virutalbox虚拟机硬盘扩容
大小改变为30GB VBoxManage modifyhd d:\newxp.vdi --resize 30000 然后用diskgenius扩从容量
- python 练习 16
#!/usr/bin/python # -*- coding: UTF-8 -*- import time myD = {1: 'a', 2: 'b'} for key, value in dict. ...
- js便签笔记(13)——jsonp其实很简单【ajax跨域请求】
前两天被问到ajax跨域如何解决,还真被问住了,光知道有个什么jsonp,迷迷糊糊的没有说上来.抱着有问题必须解决的态度,我看了许多资料,原来如此... 为何一直知道jsonp,但一直迷迷糊糊的不明白 ...
- 有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...
- Java多线程-新特征-阻塞队列ArrayBlockingQueue
阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素 ...
- Entity Framework 复杂类型
为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string Compan ...
- iframe子页面与父页面通信
同域下父子页面的通信 父页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset ...
- Eclipse汉化问题解决
1.删除eclipse/configuration 目录下的 org.eclipse.osgi 和org.eclipse.update 两个子目录2.重新启动 eclipse