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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一些扩展kmp的总结

發布時間:2024/3/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一些扩展kmp的总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

花了一天多時間學了下ex_kmp。。。。
可以看劉雅瓊ppt,講的非常清楚:
下載地址:http://url.cn/Rvjxa9
ex_kmp可以在線性時間內求文本串的每個位置與模板串的最大公共前綴?,寫法和普通kmp差不多。。
我的寫法是:

next[i]: P[i..m-1] 與 P[0..m-1]的最長公共前綴 ex[i]: T[i..n-1] 與 P[0..m-1]的最長公共前綴 ?
我的小模板: https://github.com/CKboss/MyAcmTemplate/blob/master/STRING/ex_kmp.cpp??

[html]?view plaincopy
  • /*??
  • 擴展KMP??
  • next[i]:?P[i..m-1]?與?P[0..m-1]的最長公共前綴??
  • ex[i]:?T[i..n-1]?與?P[0..m-1]的最長公共前綴??
  • */??
  • char?T[maxn],P[maxn];????
  • int?next[maxn],ex[maxn];????
  • ????
  • void?pre_exkmp(char?P[])????
  • {????
  • ????int?m=strlen(P);????
  • ????next[0]=m;????
  • ????int?j=0,k=1;????
  • ????while(j+1<m&&P[j]==P[j+1])?j++;????
  • ????next[1]=j;????
  • ????for(int?i=2;i<m;i++)????
  • ????{????
  • ????????int?p=next[k]+k-1;????
  • ????????int?L=next[i-k];????
  • ????????if(i+L<p+1)?next[i]=L;????
  • ????????else????
  • ????????{????
  • ????????????j=max(0,p-i+1);????
  • ????????????while(i+j<m&&P[i+j]==P[j])?j++;????
  • ????????????next[i]=j;?k=i;????
  • ????????}????
  • ????}????
  • }????
  • ????
  • void?exkmp(char?P[],char?T[])????
  • {????
  • ????int?m=strlen(P),n=strlen(T);????
  • ????pre_exkmp(P);????
  • ????int?j=0,k=0;????
  • ????while(j<n&&j<m&&P[j]==T[j])?j++;????
  • ????ex[0]=j;????
  • ????for(int?i=1;i<n;i++)????
  • ????{????
  • ????????int?p=ex[k]+k-1;????
  • ????????int?L=next[i-k];????
  • ????????if(i+L<p+1)?ex[i]=L;????
  • ????????else????
  • ????????{????
  • ????????????j=max(0,p-i+1);????
  • ????????????while(i+j<n&&j<m&&T[i+j]==P[j])?j++;????
  • ????????????ex[i]=j;?k=i;????
  • ????????}????
  • ????}????
  • }????


  • 一些題目:
    ?

    HDOJ 4333 Revolving Digits
    要求不同的串,因為相等的串只會出現1次,出現第二次的時候就說明有循環了。。。
    http://blog.csdn.net/u012797220/article/details/22656847?

    HDOJ 4300 Clairewd’s message

    題意看不懂:

    大概是給你一個密碼表,一個劫獲的串。那個劫獲的串的前一部分是密文后一部分是明文,但是不清楚分界線在哪里。讓你把這個串補完,并使長度盡量小。。。

    ? ? ?
    把劫獲的串整個翻譯成密碼串作為文本串T,原來串P作為模板串做EXKMP,從中間位置開始枚舉,如果在位置i上的ex[ i ]等于i到結尾的距離,分界線就在這了。。。
    http://blog.csdn.net/u012797220/article/details/22695193

    ? ?
    HDOJ 4763 Theme Section
    一段音樂的旋律在開頭,結尾,中間出現,求最大旋律長。。。。exkmp找前綴。。。挺簡單的
    http://blog.csdn.net/u012797220/article/details/22700545

    ?
    HDOJ 3613 Best Reward
    一條項鏈切成兩條,每種寶石有一定的權值。。當某一段是回文串的時候這條項鏈的值就是這條項鏈上所有寶石價值的和否則是0,問兩條項鏈最大價值是多少(權值可以為負值。。。有點小麻煩。。。。。)
    本來想當exkmp寫的,一看是回文串果斷用manacher寫了。。。。?

    ?http://blog.csdn.net/u012797220/article/details/22744671

    總結

    以上是生活随笔為你收集整理的一些扩展kmp的总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。