日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

KMP算法 hdu 1711 hdu 2203

發(fā)布時(shí)間:2024/2/28 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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ò),歡迎將生活随笔推薦給好友。