随笔分类 - 字符串
摘要:一些概念和理解:Suffix(i): 表示从i位置到字符串末尾这个子串,(后缀数组);sa[i]:表示排名为i的子串从哪个位置开始,即排名为i的子串为Suffix(sa[i]);rank[i]:表示在字符串上,第i位置在后缀数组中的排名是多少;height[i]:height[i] = Suffix(sa[i-1]) 和Suffix(sa[i])的最大公共前缀;假设有j、k,且rank[j] < rank[k],则有:Suffix(j)和Suffix(k)的最大公共前缀为height[rank[j] + 1], height[rank[j] + 2], ... , height[ran.
阅读全文
摘要:被虐残了T_T。开始没思路,膜拜大牛的思路又看不懂。。。推荐一个题解:http://hi.baidu.com/fpkelejggfbfimd/item/5c76cfcba28fba26e90f2ea6 思路是求单个串的k前缀,不如有串sx, sy。sx的k前缀是a,sy的k前缀是b,sx + sy的k前缀是c。那结果就是:c - a - b; 关于怎么求单个串的k前缀: 大概的思想是求出后缀数组的height值,然后按k进行分组。对每一组里,假设有x个连续的height值为d的情况,那么这段连续的子区间贡献出的结构就是C(x, 2)*(d - k + 1);因为数据是10^5,所有要...
阅读全文
摘要:模板题:Keywords SearchView Code //#pragma comment(linker,"/STACK:327680000,327680000")#include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <cstring>#include <algorithm>#include <string>#include <set>#include <function
阅读全文
摘要:Trie图先看一个问题:给一个很长很长的母串 长度为n,然后给m个小的模式串。求这m个模式串里边有多少个是母串的字串。最先想到的是暴力O(n*m*len(m)) len(m)表示这m个模式串的平均长度。。。显然时间复杂度会很高。。。再改进一些,用kmp让每一模式串与母串进行匹配呢?时间复杂度为O((n + len(m))*m),还算可以。可是还有没有更快的算法呢?编译原理里边有一个很著名的思想:自动机。这里就要用到确定性有限状态自动机(DFA)。可以对这m个模式串建立一个DFA,然后让母串在DFA上跑,遇到某个模式串的终结节点则表示这个模式串在母串上。就像这个图,母串“nano”在上边跑就能到
阅读全文
摘要:记一个KMP算法的应用,经典的KMP算法详解还是看这里 问题:给一个串,求这个串前i位构成的前缀由多少个子串组成。比如aabaabaabaab,前2位是aa,a重复了2次,前6位是aabaab,aab重复了2次,前9位是aabaabaab,aab重复了3次,前12位是aabaabaabaab,aab重复了4次。先说一下next()函数。pre[i] = j表示 S[1...j] = S[i - j....i];下面讨论当i % (i - pre[i]) == 0 时,例如i = 12, pre[12] = 9:如图。S[1...9] == S[3...12];因为已知 i % (i - pre
阅读全文
摘要:/*参考《算法导论》My Code:*/#include <iostream>#include <cstdio>#include <string>using namespace std;const int N = 1000;string T, P;int pi[N];void COMPUTER_PREFIX_FUNCTION(string P){ int m = P.length(), i, k; for(k = pi[0] = -1, i = 1; i < m; i++){ while(k > -1 && P[k+1] != P
阅读全文

浙公网安备 33010602011771号