字符串
文章平均质量分 56
Baoli1008
233
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
hdu 4821 String(字符串hash+map)
首先用字符串hash把每一个长度为L的字串的hash原创 2014-11-12 15:55:34 · 802 阅读 · 0 评论 -
POJ 2406 Power String(KMP)
len-f[len]为最小覆盖子串长度。如果能整除len答案就是商,否则答案是1。代码:#include #include #include using namespace std;char s[1000005];int f[1000005];void getfail(){ int len=strlen(s); f[0]=f[1]=0; f原创 2015-07-17 15:09:57 · 463 阅读 · 0 评论 -
HDU 4763 Theme Section (KMP)
先KMP求出f数组。然后令j等于f[len],在j沿着失配边走到0的路径上(即一直j=f[j]),每个节点都代表了一对相同的前后缀,且长度为f[j]。这些对前后缀都可能是答案子串,再用kmp算法在中间找这个子串存不存在即可。注意,子串长度会越来越小,而且一定包含于之前判断过的子串中(因为起点一样)。所以若前一个子串在l到r区间不存在,那么下一个子串也一定不存在。这样记录已扫描区原创 2015-07-17 14:16:28 · 491 阅读 · 0 评论 -
HDU 3336 Count the string(KMP)
KMP中的f数组相当于一个状态机。我们如果能求出处理到第i个字符时,有多少从第1个字符开始的前缀和以i为结尾的后缀完全相同,那么扫一遍这个串然后求和就行了。从第1个字符开始的前缀和以i为结尾的后缀和f数组意义很像,当沿着失配边一直走(j=f[j]),到0之前,经过多少个节点就是有多少个前缀等于后缀。所以递推维护每个f[i]到0之间有多少节点。然后扫一遍。代码:#incl原创 2015-07-17 12:23:38 · 413 阅读 · 0 评论 -
HDU 2594 Simpsons’ Hidden Talents (KMP的F数组应用)
KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后原创 2015-07-17 10:38:23 · 447 阅读 · 0 评论 -
为什么KMP算法中n-next[n]的前缀为最小覆盖子串
转自:点击打开链接 我对KMP的一些理解(lyp点拨的):pre[i](或next[i])的实质是串str[1..i]的最长且小于i的“相等前、后缀”分别为str[1..pre[i]](前缀)与str[(i-pre[i]+1)..i](后缀),通俗讲就是:使str[1..i]前k个字母与后k个字母相等的最大k值。KMP算法详解可见:http://blog.csdn.net/fjsd15转载 2015-07-15 16:50:31 · 716 阅读 · 0 评论 -
Matrix67的KMP讲解
转自:Matrix67如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。转载 2015-07-15 16:07:32 · 1262 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace(KMP最小覆盖子串)
KMP求出f数组后,最小覆盖子串为长度为len-f[len]的前缀。证明在前面的文章里。代码:#include #include #include using namespace std;char c[100005];int T;int f[100005];int main(){ scanf("%d",&T); while(T--){原创 2015-07-17 10:56:45 · 552 阅读 · 0 评论 -
POJ 2815 Milking Grid(KMP)
一个字符串的最小覆盖子串长度等于len-next[len]证明:http://blog.csdn.net/fjsd155/article/details/6866991 先算出每一行的最小覆盖长度,然后所有行的最小覆盖长度就是这些数的最小公倍数,设为r。因为列和行相互独立,所以同样处理。最后结果就是l*r注意:如果r>R 那么将r设为R,原创 2015-07-16 08:43:13 · 705 阅读 · 0 评论 -
非常系统的KMP\MP算法讲解
包含KMP和MP算法的区别,解决了大白书上的问题点击打开链接转载 2015-07-14 13:19:37 · 2002 阅读 · 0 评论 -
POJ 1056 IMMEDIATE DECODABILITY(字典树)
字典树的每个节点都标记是不是某个字符串的结尾字符。依次插入字符串,有两种错误情况:1.插入时经过了某个是结尾字符的节点2.到结尾字符时,对应的节点已经存在了代码://// main.cpp// 1056 IMMEDIATE DECODABILITY//// Created by Baoli1100 on 15/4/5.// Copyright (c)原创 2015-04-05 19:42:51 · 515 阅读 · 0 评论 -
Uva 11732 "strcmp()" Anyone? (字典树)
两个字符串匹配时,如果对应位置相同,则需要比较两次(第二次判断是否为'\0') ,若失败只需比较一次。因此,把所有字符串建成一个字典树,每个节点用num记录有多少个字符串经过这里。那么对于这个位置,考虑匹配成功的情况,共发生num×(num-1)/2×2次比较。对于这个节点的每一个后继结点,设该节点的num值为tnum,那么在前驱节点上有num-tnum个和该节点字符不相同的字符,比较原创 2015-03-18 19:31:54 · 809 阅读 · 0 评论 -
POJ 1035 Spell checker(string)应用
string的resize函数 resize(len,c);第二个参数可以缺省,默认为空字符,将string长度修改成len,如果len小于现有长度,就把这个长度后面的字符移除,如果大于现有长度就用第二个参数补全。赋值 string a="" 会把a的长度变为0用一个map做字符串到标号的映射,然后记录修正后出现的字符串标号代码://// main.cpp原创 2015-04-02 23:07:37 · 535 阅读 · 0 评论 -
UVa 11488 Hyper Prefix Sets(字典树)
字典树每个节点维护这个节点的深度和到达这里的字符串数量,用这两个的乘积维护答案即可。代码:#include #include #include using namespace std;int idx(char c){ return c-'0';}struct node{ int bt[2]; int num; int deep;}G[1000000];原创 2015-03-21 12:38:49 · 883 阅读 · 0 评论 -
AC自动机模版
//======================// HDU 2222// 求目标串中出现了几个模式串//====================#include #include #include #include #include using namespace std;struct Trie{ int next[500010][26],fail[500010]转载 2015-09-19 20:03:04 · 569 阅读 · 0 评论
分享