
字符串
文章平均质量分 76
沉溺
这个作者很懒,什么都没留下…
展开
-
2013 多校第九场 hdu 4691 Front compression(暴力 + 剪枝 OR 后缀数组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4691题目大意:输入一组字符串,对于输入的每一个字符串,输出一个数字加一个空格加一个字符串加一个回车,数字为它和上一个输入的字符串的公共前缀的长度,字符串为未匹配的字符串,空串的话长度也为1,最后输出两个数,分别是输入的所有的长度和和输出的长度和,空格和回车都算一个。思路:暴力枚举前缀,然后TLE,原创 2013-08-20 20:28:22 · 835 阅读 · 0 评论 -
hdu 3374 String Problem(字符串最小最大表示法+kmp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3374题目大意:给你一个字符串,让你分别求出最小和最大表示法的起始位置,如果有多个,就求出最左边那个,然后分别求出它在同构串中的出现次数。思路:最小最大表示法,两个一样,稍微变一下就好,然后找到位置后,最直接的就是直接做kmp,然后求出次数,由于扩大了两倍,最后那个长度为n的字符串不算,所以km原创 2013-10-24 21:51:30 · 809 阅读 · 0 评论 -
poj 3693 Maximum repetition substring(后缀数组好题)
题目:http://poj.org/problem?id=3693题目大意:就是给你一个字符串,让你找出它的连续的重复次数最多的子串。思路:罗穗骞论文里的题目,好题!论文地址:http://wenku.baidu.com/view/228caa45b307e87101f696a8.html先穷举长度L,然后求长度为L的子串最多能连续出现几次。首先连续出现1次是肯定可以的,所以这里只考虑原创 2013-10-24 21:52:06 · 750 阅读 · 0 评论 -
UVALive 4126 Password Suspects(AC自动机 + DP)
题目大意:现在有个长度已知的字符串,你知道一些它的子串,问你这个字符串的可能的种数(这些子串可以重叠),如果种数 思路:先构造AC自动机,设 d[ u ][ len ][ st ]表示最后一个是 u ,已选长度为 len ,状态为 st 的剩余种数,则有方程:d[ u ][ len ][ st ] = SIGMA(d[ ch[u][i] ][ len+1 ][ st|val[ch[u][i原创 2013-10-24 21:52:42 · 1216 阅读 · 0 评论 -
UVA 11019 Matrix Matcher( 二维字符匹配 AC自动机 + DP)
题目大意:给你n*m的一个字符T矩阵,和一个x*y的字符P矩阵,让你找出P矩阵在T矩阵中出现了几次。思路:把P矩阵一行一行插进去AC自动机,设 cc[ i ][ j ] 表示以T矩阵的第 i 行,第 j 列为左上顶点与P矩阵最多的匹配行数,那么如果在匹配过程中匹配到的字符是P的某一行末尾的字符,那么就在对应的左上顶点的 cc ++ 即可。最后统计一遍所有顶点的cc,cc == x 的数原创 2013-10-18 22:41:20 · 839 阅读 · 0 评论 -
poj 3261 Milk Patterns(最长至少k次重复子串,后缀数组基础题)
题目:http://poj.org/problem?id=3261题目大意:给你一个字符串,让你输出它的最长的至少k次重复的子串的长度。思路:先离散一下,然后构造后缀数组,然后二分答案,每次一边扫 height 就行了。代码如下:#include#include#include#includeusing namespace std;const int MAXN =原创 2013-10-20 14:39:24 · 825 阅读 · 0 评论 -
spoj 694 Distinct Substrings(求不同的子串个数,后缀数组基础题)
题目:http://www.spoj.com/problems/DISUBSTR/题目大意:给你一个字符串,然后让你求出它的不同的子串的个数。思路:先构造后缀数组,我们知道对于原串中的每个子串都对应某个后缀的前缀,那么这里后缀是按照字典序排好的,对于每一个i,它的总前缀个数是 n - sa[ i ],那么新增加的前缀个数是 n - sa[ i ] - height[ i ],也就是把这些一原创 2013-10-20 15:43:06 · 685 阅读 · 0 评论 -
UVA 11107 Life Forms(后缀数组 OR hash)
题目大意:给你一个字符串,问你这个字符串中出现次数不超过m的长度最大的子串的最右边的起始位置。思路:书上的例题,二分答案是肯定的。由于后缀数很小,那么书上的方法是直接 hash 。但是我感觉 hash 的话,直接这样做,如果运气不好会WA,写起来的确是hash快,而且不易敲错。。 = =另外一种方法就是直接后缀数组了,挺基础的一题。。hash法代码如下:#include#in原创 2013-10-19 16:50:24 · 1302 阅读 · 0 评论 -
UVA 11107 Life Forms (后缀数组 + 二份答案)
题目大意:有n个字符串,找出连续的一串长度最大的字符,并且在超过半数的字符串中出现,如果无解输出“?”,否则输出这个字符串,如果多解,按字典序输出,每两个样例之间一个空行。思路:在每个字符串后面都加上一个没出现过的字符,然后把这n个都连起来,形成一个字符串,对这个字符串求 sa、height 。之后再二份答案长度,设当二分出的长度为m,那么就一遍 height 扫过去,出现比他小的,就新增加一原创 2013-08-21 19:35:41 · 793 阅读 · 0 评论 -
UVA 10829 L-Gap Substrings(后缀数组好题)
题目大意:如果一个字符串它的形式是 UGU,U不为空,那么它就是 G 字符串,现在给你一个字符串,问你它的 L 字符串的个数为多少?思路:很容易想到用后缀数组做,关键是时间复杂度的问题,普通枚举是 n^2,会爆时间。这里考虑和上一题POJ 3693 一样的思路,枚举u的长度 u_len,然后每个 u_len ,可以把字符串分为len/u_len组,每组首字母位置为0、u_len、2*u_l原创 2013-10-26 22:23:08 · 1382 阅读 · 1 评论 -
poj 2774 (后缀数组基础题)
题目:http://poj.org/problem?id=2774题目大意:就是给你2个字符串,让你输出他们的最长公共子串。思路:拼起来,构造后缀数组,然后二分答案,判断一遍扫 height 数组就行了。代码如下:#include#include#includeusing namespace std;const int MAXN = 111111 << 1;cha原创 2013-10-20 13:49:38 · 781 阅读 · 0 评论 -
UVALive 2755 Hidden Password(字符串最小表示)
题目大意:给你一个字符串,它可以左移循环,构成 n-1 个串,问你这些字符串中字典序最小的是哪个,输出它的首字母在原先串中的位置,如果有多个,那么就输出第一个出现的,就是位置最小的那个。思路:看着像后缀数组,尝试着加着一点剪枝敲了一下,果然TLE。。 = =后来一看,原来这道题的算法很经典,具体参见这篇论文吧:http://wenku.baidu.com/view/452cbcd528原创 2013-10-22 22:13:06 · 1146 阅读 · 0 评论 -
poj 1743 Musical Theme(不可重叠的最长重复子串,后缀数组)
题目:http://poj.org/problem?id=1743题目大意:就是给你 n 个数字,现在要选取一个子串作为主题,要求,这个主题的长度要 >= 5,然后重复的主题直接不能有重叠的地方,还有,如果这个主题区间的所有数字加上或减掉某一个数 k 和另外一段区间相等,那么也算是重复出现,然你输出这个最大的长度,如果不存在,就输出0。思路:首先先解决加上减掉一个数匹配的问题,我感原创 2013-10-22 10:07:35 · 798 阅读 · 0 评论 -
URAL 1297(最长回文串)
题目:http://acm.timus.ru/problem.aspx?space=1&num=1297题目大意:给你一个字符串,问你输出其中最长的回文串,如果有多个,就输出最早出现的那个。思路:把那个字符串倒过来然后黏在后面,中间用一个不同的ASC码,然后做后缀数组,然后枚举中间位置i,对于每个i,要考虑回文串是奇数和偶数的情况,然后求 lcp,注意空间开两倍,RE了一次,挺基础的一个题原创 2013-10-19 19:43:36 · 941 阅读 · 0 评论 -
UVALive 4670 Dominating Patterns(AC自动机模板题)
题目大意:给你n个模板串和一个文本串,让你求出在文本串中出现长度最多的模板串,先输出最大次数,如果有多个,那么按照输入顺序依次输出。思路:书上的例题,AC自动机的模板题。为了去重,直接给每个字符串编号就行了。发现还是按照书上last这样来更加好,当然也可以不要last,直接暴力+。代码如下:#include#include#include#includeusing原创 2013-10-15 21:44:30 · 718 阅读 · 0 评论 -
UVA 11468 Substring(AC自动机 + dp)
题目大意:给你 k 个模板串,然后给你一些字符的出现概率,然后给你一个长度 l ,问你这些字符组成的长度为 l 的字符串不包含任何一个模板串的概率。思路:AC自动机好题啊!AC自动机建好后,考虑字符一个一个加进去,如果某个节点是单词的节点,那么这个点就是不可走的,设d[ u ][ l ] 表示当前在 u 节点,还剩下 l 步要走的概率,那么很显然 d[ u ][ l ] = SIGMA(d[原创 2013-10-15 21:43:28 · 732 阅读 · 0 评论 -
UVALive 3942 Remember the Word(trie + dp)
题目大意:给你一个字符串str,然后给你n个单词,让你用这些单词去组成这个字符串,问你有几种分解方法?思路:先开始是一个dp,设 d[ i ] 表示从 i~len-1 的方案数(注意是后缀),有关系式 d[ i ] = sum(d[ i + x]),其中这 x 个字符是一个单词。但是如果朴素的做,肯定TLE,有4000个单词,长度最长是100,str的长度也为300000,。所以这里用trie原创 2013-10-07 11:31:44 · 777 阅读 · 0 评论 -
UVA 11732 strcmp() Anyone?(trie)
题目大意:给你那个 strcmp 函数的内部,现在给你n个字符串,要两两比较,问你strcmp里判断总共用了几次?思路:trie,又是Submission error,算了,先存下吧。。代码如下(不知道对不对。。 = =):#include#include#includeusing namespace std;typedef long long lld;const i原创 2013-10-07 16:54:58 · 765 阅读 · 0 评论 -
UVALive 3026 Period ( kmp 求前缀最小循环节)
题目大意:给你一个长度为n的字符串,问你它的每个前缀的最小循环周期,并输出其中周期 >1 的位置i,和它的周期k。思路:先做kmp,这里有一个地方需要证明:如果一个串为周期串,设位置为 i ,那么(i - fail[ i ])肯定是它的最小循环节(周期为 1 也可以),循环周期为 k = (i+1)/(i - fail[ i ]),其中 (i + 1)%(i - fail[ i ]) == 0原创 2013-10-08 15:12:22 · 771 阅读 · 0 评论 -
poj 1226 Substrings(二分 + kmp)
题目:http://poj.org/problem?id=1226题目大意:给你 n 个字符串,问你他们的最长公共子串的长度,加上不同的一点就是这个最长公共串可以倒序,就是倒序的也要去匹配,然后输出。思路:基本思想就是先找到长度最小的字符串,然后枚举它的每个子串,判断另外 n - 1个字符串是不是含有,就这样。不过,其中要有优化,首先,其实前面那个找长度最小已经是一个优化了,然后长度用二分原创 2013-10-09 12:57:43 · 743 阅读 · 0 评论 -
poj 2185 Milking Grid(最小矩阵覆盖,二维 kmp 匹配)
题目:http://poj.org/problem?id=2185题目大意:给你一个二维字符串矩阵,问你最小的覆盖矩阵的大小。思路:好题啊,绝对的kmp好题!具体解题思想可以参考这个网址:http://blog.sina.com.cn/s/blog_69c3f0410100tyjl.html,这个才是真犀利,先暴力求出每行的可能的子串,然后选择一个最小的,那么着肯定是最小的列数,然后对原创 2013-10-09 13:00:16 · 822 阅读 · 0 评论 -
poj 2406 Power Strings ( fail 数组求周期)
题目:http://poj.org/problem?id=2406题目大意:给你一个字符串,让你求出这个字符串的最大周期,即把它表示为 a^k,要求出最大的 k。思路:fail 数组的最经典的应用,如果 len%(len - 1 - fail[ len ]) == 0 ,那么它的最小周期串就是 fail[len-1] + 1~ len - 1 ,最大的 k 就是 len/(len - 1原创 2013-10-10 22:20:24 · 677 阅读 · 0 评论 -
poj 2752 ( fail 数组的理解 )
题目:http://poj.org/problem?id=2752题目大意:给你一个字符串,求出它的所有子串中既是它的前缀又是它的后缀的长度,并按升序排列。思路:根据 fail 数组的定义,就是 0~fail[ i ] = i - len + 1 ~ i,len = fail[ i ] + 1。然后就是从fail[ len - 1 ]一直fail下去就行了。代码如下:#in原创 2013-10-12 00:30:41 · 904 阅读 · 0 评论 -
poj 3080 Blue Jeans ( 二分 + kmp)
题目:http://poj.org/problem?id=3080题目大意:给你m个由A、T、C、G组成的字符串,然你找出他们字典序最小的最长的公共子串,如果长度思路:先找一个长度最小的,二分长度,然后枚举子串,然后再枚举m个字符串,kmp匹配,就这样。感觉kmp的初学者来做这道题很不错。。代码如下:#include#include#includeusing namesp原创 2013-10-12 00:31:19 · 746 阅读 · 0 评论 -
poj 2541 (kmp 或 状压dp)
题目:http://poj.org/problem?id=2541题目大意:给你一个长度为n的01组成的字符串,0表示下雨,1表示晴,现在要预测n+1天的天气,找到一个长度最大且最靠后的一个位置,它的前缀等于整个字符串的后缀,且长度要 l天的天气。思路:倒着进行KMP,如果纯粹是这样,肯定爆掉,这里还有一个剪枝,那就是如果当前max_len == 13 了,那么就没必要再往后求原创 2013-10-12 00:28:51 · 912 阅读 · 0 评论 -
poj 3461 Oulipo(kmp 模板题)
题目:http://poj.org/problem?id=3461题目大意:给你两个串 p、t,让你求出 p 在 t 中出现的次数。思路:kmp 模板题,没什么好说的。。 = =代码如下:#include#include#includeusing namespace std;char p[11111],t[1111111];int fail[11111];vo原创 2013-10-14 22:00:37 · 703 阅读 · 0 评论 -
poj 3167 (kmp 好题)
题目:http://poj.org/problem?id=3167题目大意:给你两个数列a、b,长度分别为 n 、k,让你用 b 去匹配 a,只要是两者的相对大小对的上就算匹配,让你求出所有的匹配的位置。思路:KMP好题!kmp 是顺序匹配的,建设前面已经匹配了,现在正在匹配 i 和 j ,因为是相对大小,如果i位置的前面比a[ i ]的数目和 j 位置比b[ j ] 小的数目相等原创 2013-10-12 00:32:43 · 960 阅读 · 0 评论 -
poj 3450 Corporate Identity(二分长度 + 暴力kmp)
题目:http://poj.org/problem?id=3450题目大意:给你n个字符串,让你求出他们的最长公共子串,有多个时,输出字典序最小的,如果没有,就输出那句话。和之前 poj 那道一样,暴力做,可是看复杂度好像很高的样子,poj 数据水了?。。。 = =代码如下:#include#include#includeusing namespace std;con原创 2013-10-14 22:00:18 · 721 阅读 · 0 评论 -
UVA 11488 Hyper Prefix Sets(trie的应用)
题目大意:给你 n 个字符串,然后让你找出其中的一个几何 S,设 P(S)为S集合中所有字符串的公共前缀长度*字符串个数,让你求出P的最大值。思路:因为是前缀的问题,可以想到用 trie 。把字符串全都插进去,然后扫描每个节点,那么就是所有的P,该节点的P = 它到根节点的距离*经过这个节点的字符串个数,找出最大值即可。思路是有了,可是这道题还有一个地方,那就是空间问题,算一下是 10原创 2013-10-22 22:11:16 · 755 阅读 · 0 评论