生活随笔
收集整理的這篇文章主要介紹了
KMP算法 hdu 1711 hdu 2203
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
mark一下,重新溫習(xí)了 KMP
KMP復(fù)雜度O(n+m)
這里有一個(gè)解釋的超級(jí)的好的博客,大家可以去看一下:http://blog.csdn.net/v_july_v/article/details/7041827
換言之,對(duì)于給定的模式串:ABCDABD,它的最大長(zhǎng)度表及next 數(shù)組分別如下:
? ? 根據(jù)最大長(zhǎng)度表求出了next 數(shù)組后,從而有
| 失配時(shí),模式串向右移動(dòng)的位數(shù)為:失配字符所在位置?- 失配字符對(duì)應(yīng)的next 值 |
void GetNext(char* p,int next[])
{ int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen ) { //p[k]表示前綴,p[j]表示后綴 if (k == -1 || p[j] == p[k]) { ++k; ++j; next[j] = k; } else { k = next[k]; } }
}
int KmpSearch(char* s, char* p)
{ int i = 0; int j = 0; int sLen = strlen(s); int pLen = strlen(p); while (i < sLen && j < pLen) { //①如果j = -1,或者當(dāng)前字符匹配成功(即S[i] == P[j]),都令i++,j++ if (j == -1 || s[i] == p[j]) { i++; j++; } else { //②如果j != -1,且當(dāng)前字符匹配失敗(即S[i] != P[j]),則令 i 不變,j = next[j] //next[j]即為j所對(duì)應(yīng)的next值 j = next[j]; } } if (j == pLen) return i - j; else return -1;
}
hdu 1711模板題
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;int a[1000005]; //匹配串
int b[1000005]; //模式串
int next[1000005];void get_next(){next[0]=-1;int k=-1;int j=0;while(j<m){//b[k]表示前綴,b[j]表示后綴if(k==-1 || b[j]==b[k]){++k;++j;next[j]=k;}else{k=next[k];}}
}int kmp(){int i=0,j=0;while(i<n&&j<m){//①如果j = -1,或者當(dāng)前字符匹配成功(即a[i] == b[j]),都令i++,j++if(j==-1||a[i]==b[j]){i++;j++;}else{j=next[j];}}if(j==m) return i-j+1; else return -1;
}int main(){int i,t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=0;i<n;i++) scanf("%d",&a[i]);for(i=0;i<m;i++) scanf("%d",&b[i]);get_next();int ans=kmp();printf("%d\n",ans);}return 0;
}
hdu 2203 同樣是模板題
#include<stdio.h>
#include<string.h>
int n,m;char a[200005]; //匹配串
char b[200005]; //模式串
int next[200005];void get_next(){next[0]=-1;int k=-1;int j=0;while(j<m){//b[k]表示前綴,b[j]表示后綴if(k==-1 || b[j]==b[k]){++k;++j;next[j]=k;}else{k=next[k];}}
}int kmp(){int i=0,j=0;while(i<n&&j<m){//①如果j = -1,或者當(dāng)前字符匹配成功(即a[i] == b[j]),都令i++,j++if(j==-1||a[i]==b[j]){i++;j++;}else{j=next[j];}}if(j==m) return i-j+1; else return -1;
}int main(){int i,t;while(gets(a)){n=strlen(a);for(i=0;i<n;i++){a[i+n]=a[i]; }n=2*n;gets(b);m=strlen(b);get_next();int ans=kmp();if(ans==-1){printf("no\n");}else{printf("yes\n");}}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的KMP算法 hdu 1711 hdu 2203的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。