關於kmp的資料自然是matrix67的最好了(orz),以及任何專題都可以套著看看的大白書(orz)~
拓展kmp:還是劉雅瓊的ppt講得最清晰(orz)
接下來就是題集了
【hdu 1358】 period:這道題考察了kmp的基本應用
如果前面部分是乙個迴圈,那麼迴圈節的必然為i-next[i]
如果i%(i-next[i])==0則可以得到依次對應相等。
#include#include#includeusing namespace std;
const int sizen=1000005;
char str[sizen];
int next[sizen];
void getnext(char *s,int len)
return 0;
}
codeforces #246 div2 pd與此題異曲同工,可以嘗試一做
【hdu 3613】best reward
分析題意:通過講字串一分為二,得到乙個以上的權值最大的回文子串
因為是一分為二,故回文子串只可能在頭或尾產生,因此就想到了擴充套件kmp
ekmp中extend[i]的定義是:主串中以s[i]開頭的子串與模式串字首的最長長度
因此就想到:能不能將字串反轉,然後做兩次ekmp,就可以判斷了?
答案是肯定的。那再用字首和記錄前後的val,若為回文串就加上,掃一遍取最大值accepted get!
#include#include#includeusing namespace std;
const int sizen=500005;
char str[sizen],sstr[sizen];
int next[sizen];
int extend1[sizen],extend2[sizen];
int val[sizen],len;
void ekmp(char s,char t,int extend)
rep(0,ans) printf("%c",s1[i]);
rep(0,ans) printf("%c",change[s1[i]-'a'+1]);
printf("\n");
}return 0;
}
KMP演算法小結
posted on 2011 06 14 byhuangchao 主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進...
KMP演算法小結
主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進行優化?假設現在從某個位置 設為s 開始和m串進行匹配,如果匹配不...
KMP演算法小結
文字串長度為n,模式串長度為m,匹配過程的時間複雜度為o n 計算next的o m 時間,kmp的整體時間複雜度為o m n 步驟 文字串s bbc abcdab abcdabcdabde 模式串p abcdabd 1.尋找p的 最長公共元素表 前字尾最長序列長度 失配時,模式串向右移動的位數為 已...