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 · 856 阅读 · 0 评论 -
CF 126B
简单KMP #include #include #include #include using 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 · 988 阅读 · 0 评论 -
BOJ 93
KMP+状态DP #include #include #include #include using 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 · 662 阅读 · 0 评论 -
FZU 1901
简单KMP #include #include #include #include using 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 · 900 阅读 · 0 评论 -
扩展KMP模板
靠谱模版 学算法看刘雅琼写的论文 #include #include using 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 · 2325 阅读 · 2 评论 -
BNU 12883
扩展KMP简单应用 #include #include using 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 · 768 阅读 · 0 评论 -
HUST 1328
主要利用next数组 O(n)时间遍历字符串,计算当前以i结尾的字符串有几个和要求字符串匹配的 #include #include char 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 · 1009 阅读 · 0 评论 -
poj 2752
#include #include char 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 · 974 阅读 · 0 评论 -
poj 2406
#include #include char 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 · 759 阅读 · 0 评论 -
poj 3461
next[]数组,next[j]的值表示当模式中第j个字符与主串中相应字符失配时,在模式串中需要重新和主串中该字符进行比较的字符的位置。 对于next[]数组的定义如下: 1)next[j]=0 j=1 2)next[j]=max k:0 3)next[j]=1 其他 #include #include char s1[1001000],s2[10010]; int next[100原创 2012-06-23 23:03:18 · 799 阅读 · 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 · 956 阅读 · 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 · 817 阅读 · 0 评论 -
poj 3167
树状数组+KMP 有个结论是,两个串的排名串相等当且仅当这两个串的每个位置上的元素前面等于它的元素个数和小于它的元素个数都相等。 这里用树状数组维护这个性质 #include #include int a[100010],b[25010]; int c[30]; //树状数组中的元素 int m1[25010],m2[25010]; //(匹配串中)m1表示小原创 2012-07-05 02:03:49 · 2379 阅读 · 0 评论