
字符串
文章平均质量分 73
Think_Idea
水滴石穿
展开
-
后缀数组运用
1、字符串匹配:求字符串T在字符串S中出现的位置,使用后缀数组+二分查找 时间复杂度O(TlogS)sa数组的运用2、height数组3、结合rmq的询问原创 2015-09-21 17:38:28 · 323 阅读 · 0 评论 -
poj3581 Sequence(后缀数组sa的运用+离散化)
题目链接:点击打开链接题意描述:给定一个整数序列,序列的第一个元素大于其余所有的元素,先把序列截成三段,然后对每一段进行逆转,求新生成的序列中字典序最小的序列?解题思路:后缀数组sa的运用+离散化分析:先分析第一段:如图所示表示目标序列,对第一段的长度进行讨论,其中红色1表示第一个元素,也就是最大值1、如果上面三个序列在0~1区间不等,那么我们选取字典序较小原创 2015-09-21 17:30:17 · 513 阅读 · 0 评论 -
hdu5442 Favorite Donut(后缀数组求正逆序中字典序最大的字符串)
题目链接:点击打开链接题意描述:给定一个字符串,如abc:正序abc、bca、cab以及逆序acb、bac、cba中字典序最大的那个字符串开始的位置以及正序or逆序i?如果字典序相同,取字符串开始位置较小的,如果开始位置也相同,优先取正序?解题思路:后缀数组分析:我们可以在abc后面再接一个abc则abc正序的所有可能都包含在abcabc中,且开始位置在0~n-1有效,同理逆序原创 2015-09-20 10:08:14 · 651 阅读 · 0 评论 -
hihocoder Trie图(AC自动机)
代码:#include #include #include #define MAXN 1000010using namespace std;int q[MAXN];int ascii[256];struct Trie{ int child[MAXN][26],fail[MAXN]; bool mark[MAXN]; int root,L; int原创 2015-09-13 23:14:52 · 621 阅读 · 0 评论 -
hihocoder Browser Caching(字符串hash)
题目链接:点击打开链接题意描述:在浏览网页的时候,缓存技术能够迅速地显示页面。这里我们对浏览器的缓存技术进行简化:我们认为浏览器的缓存大小为M,表示缓存可以存储M个页面。当用户访问URL时,浏览器会先到缓存中查询是否有该页面的记录,如果有则直接从缓存中提取数据;否则,会发送网络请求,从Internet获取该页面,并将该页面放入缓存中。当缓存中的页面数量超过M时,缓存技术会替换掉缓存中最原创 2015-09-13 23:09:25 · 487 阅读 · 0 评论 -
poj3261(后缀数组--可重叠的k次最长重复子串+二分+离散化)
题目链接:点击打开链接题意描述:给定一个字符串,找出可重叠k次的最长重复子串?解题思路:后缀数组+二分+离散化代码:#include #include #include #define maxn 20010using namespace std;int wa[maxn],wb[maxn],wv[maxn],ww[maxn];int cmp(int* r,int a,in原创 2015-09-04 16:29:59 · 458 阅读 · 0 评论 -
poj1743 Musical Theme(后缀数组--不可重叠最长重复子串+二分)
题目链接:点击打开链接题意描述:给出一首歌词,找出这首歌的最长主题?1、主题长度不能小于52、在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值)3、主题之间至少有一个和其他的没有重叠解题思路:后缀数组+二分 O(nlogn)分析:1、首先我们可以对长度进行二分,这样问题就转化为是否存在长度为l的不可重叠重复子串?2、原创 2015-09-04 15:37:41 · 537 阅读 · 0 评论 -
hdu3518 Boring counting(后缀数组)
题目链接:这里写链接内容 题目描述:给一个字符串,统计该字符串中所有重复出现两次的子串的数量 1、重复出现的两个子串之间不能重叠 2、相同的子串只能算一次解题思路:后缀数组da 分析: 1、首先我们计算出字符串的sa以及height,然后枚举子串可能的长度; 2、对于当前长度i我们遍历height数组,如果height[j]>=i说明sa[j-1]与sa[j]的最长公共前缀长度大于i,更原创 2015-09-04 13:43:02 · 451 阅读 · 0 评论 -
hdu2825 Wireless Password(AC自动机+状压dp)
题目链接:这里写链接内容 题目描述:给定n、m、k,其中n为密码的长度,m为已知串的数量,k为密码中应该包含的已知串的数量,问密码有多少种可能?解题思路:AC自动机+状压dp 状态:dp[i][j][k] 其中i为密码的长度,j为当前在AC自动机中所处的状态,k为包含的已知串的信息,k转化为二进制,如果第x位为1则说明包含第x个已知串 状态转移方程: dp[i+1][next1[j][u]原创 2015-09-03 19:26:30 · 595 阅读 · 0 评论 -
hdu2457 DNA repair(AC自动机+dp)
题目链接:点击打开链接题意描述:给定一些带有病毒的DNA序列,然后给出一串DNA,问最少修改多少个字符使DNA中不含有带病的序列?解题思路:AC自动机+dp分析:首先这是一个多字符串问题,可以想到使用AC自动机,其次问最少需要修改多少字符,显然我们可以考虑使用dpdp[i][j]:表示长度为i的字符串在AC自动机中状态为j时所需要的最小修改在状态转移方程为:dp[i+1][原创 2015-09-03 16:01:57 · 633 阅读 · 0 评论 -
hdu2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题目链接:点击打开链接题目描述:给定一些词根,求至少含有一个词根的长度解题思路:AC自动机+矩阵快速幂分析:这道题目和poj2778 DNA Sequence 是一样的,如果还没做过那道题目建议先去做一下再做这道1、首先要知道图的邻接矩阵幂的含义是什么?不知道的请看:点击打开链接有了上述概念之后:AC自动机本身就是一张图,AC自动机上的每个状态表示图中的一个顶点,每条经过a原创 2015-09-03 09:51:49 · 704 阅读 · 0 评论 -
poj2778 DNA Sequence(AC自动机+矩阵快速幂)
题目链接:点击打开链接题意描述:给m字符串,这m个字符串是带有病毒的DNA。然后问一个长度为n的字符串不带有任何病毒有多少中可能?所有字符串之后ACGT这几个字符串组成解题思路:AC自动机+矩阵快速幂前置内容:邻接矩阵幂的含义:点击打开链接分析:首先根据题意先建一个AC自动机,其实AC自动机本身就是一张图,AC自动机中的每个结点就相当于图中的顶点,每个转移A、C、G、T就相原创 2015-09-02 16:10:49 · 653 阅读 · 0 评论 -
hdu3065 病毒侵袭持续中(AC自动机,统计每个字符串出现的次数)
题目链接:点击打开链接题意描述:给一些字符串和一个文本,统计每个字符串在文本中出现的次数?解题思路:很简单的AC自动机代码:#include #include #include #define MAXN 60000using namespace std;int ans[1010];struct Trie{ int next1[MAXN][26],fail[MAX原创 2015-09-01 16:07:47 · 1013 阅读 · 0 评论 -
hdu2896病毒侵袭(ac自动机,求模式串出现的个数)
题目连接:点击打开链接题目描述:给定一些字符串和一些文本,找出每个文本中出现的所有字符串?解题思路:很裸的一道ac自动机题目代码:#include #include #include using namespace std;priority_queue,greater >pq;struct Trie{ int next[210*500][128],fail[210原创 2015-09-01 15:02:01 · 580 阅读 · 0 评论 -
hdu4300 Clairewd’s message(扩展KMP)
题目链接:点击打开链接题目描述:给定一个字母转换表,然后给一个字符串,字符串的前一部分经字母转换表转换过之后的字符,字符串的后面一部分是未经转换之前的,后面的部分可能不完整,但前面被转换过之后的一定是完整的,求补充不完整的部分(当然也有可能是完整的,如果是完整的直接输出即可),要求尽可能的短?解题思路:扩展KMP算法(匹配前缀)分析:相当于让字符串的后面部分尽可能长的匹配前面的原创 2015-08-31 20:59:37 · 463 阅读 · 0 评论 -
hdu4333 Revolving Digits(扩展kmp+kmp最小循环节)
题目链接:点击打开链接题意描述:给定一个字符串,可以把字符串的后x位移到字符串前面组成一个新的字符串?问对于所有的新组成的字符串中去掉重复的之后,比原串小的个数,等于的个数,大于的个数?解题思路:扩展KMP(next1[i]数组含义:x[i···len-1]与x[0···len-1]的最长公共前缀)分析:首先我们把字符串s复制一遍接到原字符串后面形成ss,这样在ss中以i(i>=0&&原创 2015-08-31 17:45:07 · 681 阅读 · 0 评论 -
hdu1358 Period(kmp周期)
题目链接:点击打开链接题意描述:给一个字符串,求这个字符串中每个前缀自身是否有周期性?解题思路:kmp即可代码:#include #include #define MAXN 1000010using namespace std;void getNext(char* str,int len,int* next){ int i,j; j=next[0]=原创 2015-08-31 12:13:09 · 637 阅读 · 0 评论 -
hdu3746 Cyclic Nacklace(kmp周期 最小循环节)
题目链接:点击打开链接题意描述:给定一个字符串,求使这个字符串是循环字符串至少需要添加多少个字符?要求循环至少两次解题思路:kmp(next[]数组性质:点击打开链接)根据next[]数组的性质我们可以得到一个字符串最小循环节为n-next[n],所以我们可以得出结论if((n%(n-next[n])==0)&&(n/(n-next[n])>1)) printf("0原创 2015-08-31 11:29:00 · 934 阅读 · 1 评论 -
hdu3336 Count the string(dp)
题目链接:点击打开链接题意描述:给定一个字符串,求所有 前缀出现的次数之和?如abab 其中a出现2次,ab出现2次,aba出现1次,abab出现一次,所以答案是6解题思路:dp我们仔细观察可以发现,只有和a匹配的可能匹配ab,只有匹配ab的才能匹配aba,只有匹配aba的才能匹配abab,所以我们用一个队列保存下一次要匹配的位置,如果匹配成功则把当前位置+1放入队列,原创 2015-08-31 10:12:37 · 506 阅读 · 0 评论 -
hdu4763 Theme Section(KMP水题)
题目链接:点击打开链接题意描述:给定一个字符串,找出长度最大的子串,使开始、中间、结尾至少都包含它?解题思路:从大到小枚举子串长度,先判断结尾和开始是否一样,如果一样,则使用kmp判断中间是否含有子串,如果有就是答案代码:#include #include #include #define MAXN 1000010using namespace std;cha原创 2015-08-28 15:32:18 · 618 阅读 · 0 评论 -
hdu4760Good Firewall(Trie树)
题目链接:点击打开链接题意描述:现有一个网络中,在不同的子网之间建立转发策略,有相同的转发策略的子网之间可以互相通信给出以下三种操作:操作一:E 可以理解为建立标号为id的转发策略,有n个子网,这n个子网之间有相同的转发策略id操作二:D 取消id这种转发策略操作三、询问ipsrc与ipdst是否有相同的转发策略(当然一个ip地址可能有多种转发策略)问题,对于每次询问,如原创 2015-08-22 16:00:44 · 884 阅读 · 0 评论 -
AC自动机
定义:原创 2015-08-08 15:15:29 · 627 阅读 · 0 评论 -
Trie树讲解
Trie树简介:又称字典树、前缀树、单词查找树或键树,是一种用于快速检索的树形结构,是一种哈希树的变种用途:1、字符串检索:实现将一些字符串的有关信息保存到trie树中,查找另外一些字符串是否出现过或者出现的频率2、前缀匹配:匹配前缀3、排序:tire树是一颗多叉树,只需先序遍历整棵树,输出相应的字符串便是按字典序排序的结果4、作为其他数据结构和算法的辅助结构:ac自动机、后缀原创 2015-08-08 10:26:52 · 1121 阅读 · 0 评论 -
hdu4513 吉哥系列故事——完美队形II
题目:在一个长度为n的数组里面找回文串,要求回文串从中间向两边一次递减思路:manacher算法:时间复杂度O(n)在manacher过程中添加限制语句保证题目要求即可st[i-p[i]]st[i-p[i]+2]///表示回文串的左侧部分,前面要比后面的小代码:#include #include #define MAXN 100010using原创 2015-08-07 15:58:15 · 933 阅读 · 0 评论 -
hdu1711 Number Sequence(KMP水题)
题意:在a串中寻找第一个包含b串的的位置思路:直接KMP即可#include #define MAXN 1000010using namespace std;void kmp_pre(int x[],int m,int next[]){ int i,j; j=next[0]=-1; i=0; while(i<m){ while(-原创 2015-08-07 15:03:00 · 403 阅读 · 0 评论 -
KMP算法
代码:#include #define MAXN 10010using namespace std;void kmp_pre(char x[],int m,int next[]){ int i,j; j=next[0]=-1; i=0; while(i<m){ while(-1!=j&&x[i]!=x[j]) j=next[j];原创 2015-08-06 23:56:46 · 665 阅读 · 0 评论 -
hdu5340 Three Palindromes(manacher算法)
题目描述:判断是否能将字符串S分成三段非空回文串。解题思路:基本思路:我们可以枚举第一个字符串的结尾e和第三个字符串的开始s,那么第二个字符串就是从e+1到s-1,判断第二个字符串是否为回文即可原创 2015-08-02 16:41:23 · 1243 阅读 · 1 评论 -
hdu3068 最长回文(manacher 算法)
题意: 给定字符串,求字符串中的最长回文序列解题思路: manacher 算法 时间复杂度:O(N)代码:#include #include #include #define MAXN 110010using namespace std;char b[MAXN],a[MAXN<<1];int p[MA原创 2015-08-02 00:44:11 · 750 阅读 · 0 评论 -
BestCoder Round #44
1001:简单的模拟题#include #include using namespace std;int d[4]= {400,600,800,1000};int s[4]= {1000,1500,2000,2500};int main(){ int T; scanf("%d",&T); for(int t=1; t<=T; ++t) {原创 2015-06-15 10:58:01 · 363 阅读 · 0 评论 -
KMP算法详解
引记 此前一天,一位MS的朋友邀我一起去与他讨论快速排序,红黑树,字典树,B树、后缀树,包括KMP算法,唯独在讲解KMP算法的时候,言语磕磕碰碰,我想,原因有二:1、博客内的东西不常回顾,忘了不少;2、便是我对KMP算法的理解还不够彻底,自不用说讲解自如,运用自如了。所以,特再写本篇文章。由于此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇。 本文分转载 2014-10-19 00:44:53 · 628 阅读 · 0 评论