摘要: 题意:求多个串的最长公共子串pku3450用KMP算法#include<iostream>#include<algorithm>#include<string.h>using namespace std;int nxt[210];char str[4010][210],s[210];int n,m;bool KMP(char *T,char *P){ memset(nxt,0,sizeof(nxt)); nxt[0]=-1; int k=-1; for(int q=1;q<m;q++) { while(k>-1&& P[k+1]! 阅读全文
posted @ 2011-11-09 18:16 枕边梦 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 比较裸的KMP#include<iostream>#include<algorithm>using namespace std;int n,m;char T[1000010],P[10010];int nxt[10010];int KMP(){ nxt[0] = -1; int k = -1; for(int q=1;q<=m-1;q++){ while (k > -1 && P[k+1] != P[q]) k = nxt[k]; if (P[k+1] == P[q]) ++k; nxt[q] = k; }... 阅读全文
posted @ 2011-11-09 15:46 枕边梦 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意:在文本T[1..n],找一个最长的后缀(长度为m,m<=13),以这个后缀为匹配的模式P:T[n-m+1..n]找出P在文本T[1..n-1]出现的最后一个起始位置k,(k<=n-m)若找到k,则得出T[n+1]为找到的模式T[k..k+m-1]的下一个位置: 即:T[n+1] = T[k+m]如果m==13时找不到,则尝试m==12直到m==1,如果都找不到,则T[n+1] = 0;分析:* KMP* 一旦得到一个匹配之后就增加源串长度 下次找匹配 T 和 P 都会变* 因为这次匹配之后 给源串增加的那个字符就是前面相匹配的串的下一个字符* 所以至少这个位置会继续匹配下去* 阅读全文
posted @ 2011-11-09 15:17 枕边梦 阅读(145) 评论(0) 推荐(0) 编辑