
KMP
Benzema67
北京邮电大学学生
展开
-
HDU 3746 Cyclic Nacklace
做这个题需要好好理解KMP算法,尤其是next数组。非优化的next数组的含义是:next[i]=k默示模式串下标为i的字符的前k-1个字符与开首的前k-1个字符相等,那么从1到i-1的模式串必定是轮回的,且循环节的长度为i-next[i].理解了这一点这个题就很简单了。#include #include #include #include char s[100005];i原创 2012-02-08 16:14:03 · 875 阅读 · 0 评论 -
CF 126B
简单KMP#include#include#include#includeusing namespace std;char s[1000005];int next[1000005],flag,len;bool hash[1000005];void getnext(){ int k=1,j=0; next[k]=0; while(k<=len+1){原创 2012-09-22 20:52:52 · 1008 阅读 · 0 评论 -
BOJ 93
KMP+状态DP#include#include#include#includeusing namespace std;char q[1200000],p[1200000];int nex[1200000];void getnext(){ int len=strlen(q),i,j,k=0,l; nex[0]=-1;i=0;j=-1; while(i<len){ if原创 2012-08-28 14:45:10 · 679 阅读 · 0 评论 -
FZU 1901
简单KMP#include#include#include#includeusing namespace std;char s[1000005];int next[1000005],flag,len;void getnext(){ int k=1,j=0; next[k]=0; while(k<=len+1){ if(j==0||s[k]=原创 2012-09-05 16:27:39 · 918 阅读 · 0 评论 -
扩展KMP模板
靠谱模版学算法看刘雅琼写的论文#include#includeusing namespace std;const int MM=100005;int next[MM],extand[MM];char S[MM],T[MM];void GetNext(const char *T){ int len=strlen(T),a=0; next[0]=len;原创 2012-08-24 18:02:38 · 2345 阅读 · 2 评论 -
BNU 12883
扩展KMP简单应用#include#includeusing namespace std;const int MM=1000005;int next[MM],extand[MM];char S[MM],T[MM];void GetNext(const char *T){ int len=strlen(T),a=0; next[0]=len; while原创 2012-08-24 18:11:14 · 786 阅读 · 0 评论 -
HUST 1328
主要利用next数组O(n)时间遍历字符串,计算当前以i结尾的字符串有几个和要求字符串匹配的#include#includechar s[100100];int next[100100];void getnext(){ int i=1,j=0,k; next[1]=0; k=strlen(&s[1]); while(i<=k+1){ if(j==0 || s[i]==s原创 2012-07-31 00:25:53 · 1028 阅读 · 0 评论 -
poj 2752
#include#includechar s2[400100];int next[400010],a[400100];void getnext(){ int i=1,j=0,k; next[1]=0; k=strlen(&s2[1]); while(i<=k){ if(j==0 || s2[i]==s2[j]){ i++,j++; next[i]=j; }原创 2012-06-23 23:31:49 · 999 阅读 · 0 评论 -
poj 2406
#include#includechar s2[1000100];int next[1000010];void getnext(){ int i=1,j=0,k; next[1]=0; k=strlen(&s2[1]); while(i<=k){ if(j==0 || s2[i]==s2[j]){ i++,j++; next[i]=j; } else原创 2012-06-23 23:44:54 · 773 阅读 · 0 评论 -
poj 3461
next[]数组,next[j]的值表示当模式中第j个字符与主串中相应字符失配时,在模式串中需要重新和主串中该字符进行比较的字符的位置。对于next[]数组的定义如下:1)next[j]=0 j=12)next[j]=max k:03)next[j]=1 其他#include#includechar s1[1001000],s2[10010];int next[100原创 2012-06-23 23:03:18 · 836 阅读 · 0 评论 -
Codeforces 182D - Common Divisors
KMP求最小循环节#include #include #include #include char s1[100005],s2[100005];int next[100005],flag;void getnext(char * s){ int k=1,j=0,len=strlen(&s[1]); next[k]= 0; while(k<=len ){原创 2012-04-25 09:22:06 · 991 阅读 · 0 评论 -
HDU 1358 Period
还是找循环节,和hdu3764一样直接贴码了#include #include #include #include char s[1000005];int next[1000005],flag,n;void getnext(){ int k=1,j=0; next[k]= 0; while(k<=n ){ if( j== 0|| s[k原创 2012-02-08 16:23:50 · 826 阅读 · 0 评论 -
poj 3167
树状数组+KMP有个结论是,两个串的排名串相等当且仅当这两个串的每个位置上的元素前面等于它的元素个数和小于它的元素个数都相等。这里用树状数组维护这个性质#include#includeint a[100010],b[25010];int c[30]; //树状数组中的元素int m1[25010],m2[25010]; //(匹配串中)m1表示小原创 2012-07-05 02:03:49 · 2404 阅读 · 0 评论