随笔分类 - 算法---字符串匹配
摘要:/*题意:输出首尾串相同的前段位置 ,例abbcaabb,符合的:abb--abb,abbcaabb--abbcaabb,所以输出3,8思路:Kmp 此题对于刚接触kmp的新手(比如说我),可以更深一点理解kmp思想 我们先看看两个例子abbcaabb,输出的是3,8 ababcababababcabab,输出2,4,9,18 其实可以看出一个规律,例一:next[8] = 3; next[3] = 0;例二:next[18] = 9; next[9] = 4; next[4] = 2; next[2] = 0; 那么是不是只要把字符串长度(l)输出,然后递归输出next[l] (l = ne
阅读全文
摘要:/* 基本题意:给一个字符串,如果在前 i 位置处满足连续循环A^K(A:单位循环段, K:循环个数),则输出i和K 这题跟pku 2406差不多 YY : kmp 保存 next[i],如果满足 i能被单位长度(i - next[i])整除,说明 (i - next[i])是单位循环段A,i /(i - next[i])也就是K。 举两个例子应该就能理解 例一: i : 12345678 字符串 : abababab next[i]: 00123456 这个例子假如当i等于8时,next[i] = 6; K也就是4,如果你有“ 你只是看 了后面[next[i]+1,i ] 这一段,不能代表全
阅读全文
摘要:/* 题意:给两个字符串a,s,判断a在s里出现的个数*/#include <stdio.h>#include <string.h>int next[10005];char a[10005];char s[1000005];int n,len_a,len_s;void Get_Next(){ a[0] = '#';//因为是a+1,如果a[0]不存在,那strlen(a) = 0 ; !!!!!!!!!!! len_a = strlen(a); len_s = strlen(s); next[1] = 0; int j = 0; for(int i=2;
阅读全文
摘要:本打算搞掉2222,此题之神如同其题号,百度得知是AC自动机,后知要运用KMP的东西,于是转向此题入门题意:给一个字符串,输出包括从1到len长 字符串前缀的总个数YY: 基本思想是 KMP + DP,主要看KMP kmp思想:对字符串进行预处理,记录与当前位置i后缀相同的“最近”位置,用next[i]记录, 保证 s[1 .. i] 中 s[i - next[i] + 1 .. i] 与 s[1 .. next[i]] 是相同的, 以便在某处字符不匹配时,不用重新从头判断一遍,只要从对应的next[i]即可, 因为中间有部分与自身重叠,减少了不必要的判断,实现见代码。 例1: i : 123
阅读全文

浙公网安备 33010602011771号