KMP
捡石子的小孩
这个作者很懒,什么都没留下…
展开
-
Oulipo hdu1686
自己做的第一道字符串匹配的题目,纯模板题。哎,初学KMP,纪念一下吧#include#include#includechar P[10005],T[1000005];int next[10005];void init_next(){ int k,m=strlen(P); next[1]=0; k=0; for(int i=1;i<m;i++) {原创 2012-10-18 22:34:45 · 929 阅读 · 0 评论 -
poj3461 KMP模板题
题意:给定两个字符串,求在主串中模式串出现的次数。#includechar A[1000005],B[10005];int next[10005];void getnext(){ int i,j; next[0]=0; for(i=1,j=0;B[i];i++) { while(j>0&&B[i]!=B[j])原创 2013-03-16 19:52:11 · 967 阅读 · 0 评论 -
poj2406 找最小循环节
这题同hdu3746一样,都是通过KMP找到字符串的最小循环节。这题wa了一次,刚开始以为一定有len%(len-next[len-1])==0,后来证实是错的。如:ababa,按照之前的做法输出2,很显然n=1。#include#include#define N 1000005char s[N];int next[N],len;void getnext(){ int原创 2013-03-16 18:42:50 · 1419 阅读 · 0 评论 -
hdu3746 利用KMP找循环节
题意:在一个串的后面添加若干字符,使其成为一个循环串。/*利用next数组求循环节结论:当且仅当len%(len-next[len-1])==0时,s[next[len-1]~len-1]为最小循环节*/#includeconst int N=100005;char s[N];int next[N],len;void getnext(){ int i,j;原创 2013-03-16 17:56:54 · 1092 阅读 · 0 评论 -
hdu2203
思路:首先判断s2是否是s1的子串,若是,则直接输出yes;否则,就利用前一步骤得到的s1的后缀与s2的前缀的公共部分,判断s2的后缀(去掉公共部分的其它部分)与s1的前缀是否相同,若是,则输出yes。#include#includeconst int N=100005;char s1[N],s2[N];int next[N];void init_next(){ int原创 2013-03-16 14:40:33 · 1025 阅读 · 0 评论 -
hdu1711
#includeint A[1000005],B[10005];int next[10005];int n,m;void init_next(){ int i,j; next[1]=0; for(i=2,j=0;i<=m;i++) { while(j>0&&B[i]!=B[j+1]) j=next[j];原创 2013-03-16 13:58:06 · 1034 阅读 · 0 评论 -
hdu1867 A + B for you again KMP
题意:给你两个串,求他们连接成的最短串,连接时合并相同部分。还有当以两种方式连接(s1s2、s2s1)得到的最短长度相同时,取字典序最小那种。#include#include#includeusing namespace std;const int N=100005;int next[N];void init(char *s)//get next[]{ int i,j原创 2013-03-15 18:33:09 · 1154 阅读 · 0 评论 -
poj2752 求一个串所有的前后缀
题意:给定一个串,求出该串的所有前后缀的长度(包括该串本身)。/*感觉这道题就是求next数组的逆过程,但首先还是要求一遍next数组,得到最后一个元素的next值,然后再从最后一个元素开始根据next值往前推,直到next值等于0为止*/#include#define N 400010char s[N];int next[N],len;void getnext(){原创 2013-03-16 19:39:37 · 1169 阅读 · 0 评论 -
hdu1358 循环节
题意:给定一个字符串,求该串长度为i的前缀的最大循环周期(前提是该前缀是循环串)。#include#define N 1000005char s[N];int next[N],n;void getnext(){ int i,j; next[0]=0; for(i=1,j=0;i<n;i++) { while(j>0&&s[i]!=s[j原创 2013-03-16 19:12:55 · 1168 阅读 · 0 评论 -
hdu2087
#include#include#includeusing namespace std;const int N=1005;char s1[N],s2[N];int next[N];void init_next(){ int i,j; next[0]=0; for(i=1,j=0;s2[i];i++) { while(j>0&&s2原创 2013-03-16 13:39:03 · 1048 阅读 · 0 评论 -
hdu4300 KMP
题意:给你两个字符串S1,S1,其中S1[i]表示第i个字母对应的密码,S2由两部分构成,前面为暗文,后面为明文,题目保证暗文部分是完整的,但名文部分不一定完整(可以没有)。题目要求根据完整的暗文来找到明文,且要求补充后的S2总长度最短。 刚开始想到的是枚举明文和暗文的分割线位置,写了一个程序后,果断超时。。。后来想到可以以原始串S2为主串,根据S1得到的S2'为模式串进行匹配,求出当i原创 2013-03-24 16:00:56 · 1047 阅读 · 0 评论