字符串
文章平均质量分 78
未水
这个作者很懒,什么都没留下…
展开
-
hdu2222 AC自动机入门 指针型模板
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define maxnode 10000*100 #define sigma_size 26 struct Node原创 2013-07-03 20:22:16 · 600 阅读 · 0 评论 -
POJ 2185 KMP
求循环节长度直接len-f[len] 注意可能循环节长度不超过R,C #include #include #include using namespace std; #define N 100500 int vis[N]; int getfail(char *s,int *f) { f[0]=f[1]=0; int len=strlen(s); for(in原创 2013-10-20 23:12:48 · 782 阅读 · 0 评论 -
hdu4758 AC自动机+dp
不用AC自动机的话,怎么dp,推公式都会交叉,都会重复,只有用AC自动机分离出一个个匹配的状态才能解决 此题是poj2778 DNA sequence的弱化版 1.对自动机上每个状态dp,dp[a][b][c][d]表示经过了a个字符,匹配了b个R,在c这个状态,d是4进制数,表示是否经过串1和串2 trie树上其实代表一种转移关系,即当前匹配了i个字符,遇到i+1个字符会转到哪个状态 2原创 2013-09-23 23:12:02 · 1198 阅读 · 0 评论 -
hdu2920 字符串哈希
模式串中#,*把它分成一截截,当某一截在S串中多个位置能找到匹配,找第一个匹配点,贪心 因为当中间有#,*,可以利用它跳过一些字符, 当遇到#,先跳过一个字符,其他的一截截贪心去找到匹配位置,若最后剩余偶数个字符,则match 第一截和最后一截如果是非#和*,必须严格匹配 找来的哈希写法 #include #include #include #include #include原创 2013-10-06 00:46:49 · 1360 阅读 · 0 评论 -
poj 1204 AC自动机
最直观的想法是8*(n*n)*n*n暴力 由于在表里面要朝8个方向走,不能在上面建自动机,所以要在pattern建自动机 建好后,在原表上朝8个方向走遍历整个表,这时候复杂度是8*n*n 比较慢,但觉得比较直观 #include #include #include using namespace std; #define sigma_size 26 #define N 1010原创 2013-09-18 12:58:06 · 889 阅读 · 0 评论 -
codeforce Round201 div1 B. Lucky Common Subsequence KMP+DP
这种包含或不包含某串总是dp+KMP或者AC自动机,dp的状态包含KMP或者AC自动机的状态,然后利用fail指针实现转移 求KMP,在普通的最长公共子序列加一维记录匹配的状态 dp[i][j][k]记录A的i位置和B的j位置时匹配到virus的k状态的答案有多少个 wa的原因 1.如果初始化,只初始化dp[0][0][0]=0是不对的,其实本题不初始化,全部都为0没问题 2.不知道怎么原创 2013-09-30 12:50:07 · 1411 阅读 · 1 评论 -
poj 1816 字典树trie+自动机的理解
?当做一个普通字符来处理,匹配遇到任何字符时都往下走 *的处理,不能在当前状态连一条连向自己的边,这样会有状态冲突, 比如 4 * ?* *? ?? 这一组,这样构造出来的会包含*?*? *必须连向一个新的节点,匹配字符为*,这个新的节点连一条连向自己的边,在dfs匹配时一遇到*就往下走,p不增加, 在有连向自己的边的节点上,可以p+1但不往下走,也可以p+1并往下走 dfs原创 2013-09-11 21:29:36 · 1080 阅读 · 0 评论 -
poj 2778 经典 AC自动机+dp
http://blog.henix.info/blog/poj-2778-aho-corasick-dp.html 讲得很好 1.当要转移的次数很多,有牵涉到很多关系时,用矩阵 2.fail指针的理解 用数组的写法更容易理解 #include #include #include using namespace std; #define mod 100000 #define CH原创 2013-09-06 01:04:49 · 790 阅读 · 0 评论 -
poj 2406 KMP 重复子串
没考虑 len%(len-f[len])!=0 的情况,太挫了 #include #include #include #include #include #include using namespace std; char str[1000500]; int f[1000500]; int main () { while(scanf("%s",str)!=EOF)原创 2013-09-05 19:36:42 · 800 阅读 · 0 评论 -
hdu 4691 lcp最长公共前缀 后缀数组经典模板
每行无论公共前缀是多少,都要一个空格和换行,+2 注意公共前缀的长度 #include #include #include using namespace std; #define N 100100 int sa[N],t[N],t2[N],c[N]; char ss[N]; int s[N]; void build_sa(int n,int m) { int *x=t,*y=原创 2013-08-21 16:45:28 · 2909 阅读 · 0 评论 -
后缀数组 倍增算法 代码详解
sa[i],表示按后缀树那种排列方式,排在第i位的后缀是哪个后缀 for循环里,y[i]表示对于现在的sa数组(排序处理到当前状况时),第二关键字第i大的第一关键字的位置 x[i] 表示上图中每次要排序的序列,首字母在i的后缀的排位,是rank数组 基数排序:每个元素的值对应一个槽radix,统计各个槽的累积个数,就能得到那个元素的排位 char s[maxn]; int sa[原创 2013-07-19 16:48:46 · 3435 阅读 · 2 评论 -
hdu4622 后缀自动机 模板
抄来的代码 #include #include #include #include using namespace std; #define N 5050 struct Node { int step; Node *pre,*nxt[26]; void clear() { step=0; pre=NULL;原创 2013-10-23 22:31:37 · 2137 阅读 · 0 评论