
字符串
文章平均质量分 79
qian99
这个作者很懒,什么都没留下…
展开
-
LA 3942 Remember the Word(Trie+DP)
题意:给出S个不同单词组成的字典和一个长字符串,把这个字符串分解成若干个由S组成的单词的连接有多少种方法。思路:先把S都插入字典树,dp[i]表示从i开始的字符串的分解方式的个数,则每对应一个从i开始的在S集合中的串ss,dp[i]+=dp[i+strlen(ss)]。代码:#include#include#include#include#include#in原创 2014-01-24 11:14:00 · 1058 阅读 · 0 评论 -
hdu 3341 Lost's revenge(AC自动机+DP)
题意:给出n个串,再给出一个串A,现在可以随便改变A串中字符的顺序,问重排后n个串最多与A有多少匹配。思路:构建AC自动机以后,用dp[i][j][k]表示长度为i的串在AC自动机的j结点,状态为k时的最大匹配数,这里k是ACGT字符个数的一个状态,我用了一个四维数组来把这个状态映射为一个数,用这个数来表示状态,这样就比较好写了。。。状态方程也比较简单……代码:#inc原创 2014-02-04 15:49:49 · 910 阅读 · 0 评论 -
UVA 11019 Matrix Matcher(AC自动机矩阵匹配)
题意:二维字符串的匹配,给出一个n*m的字符矩阵T,求给定的x*y的矩阵P出现了多少次。思路:用match[i][j]表示以(i,j)为左上角的,和P大小相同的矩阵中和P中匹配的行的个数。对于每一行,如果有匹配,那么就要在相应的位置+1,最后统计match[][]中值为x的个数,由于字符串会有重复的,所以需要处理一下。代码:#include#include#incl原创 2014-02-07 13:02:47 · 751 阅读 · 0 评论 -
poj 3261 Milk Patterns(后缀数组)
题意:求最长重复子串长度,并且这个子串至少出现k次。思路:二分长度,然后后缀数组搞……感觉后缀数组写起来好蛋疼。代码:#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f#define Inf 0原创 2014-02-12 13:25:03 · 622 阅读 · 0 评论 -
spoj 694. Distinct Substrings(后缀数组)
题意:给出一个串,求串中不同子串的个数。思路:利用后缀数组的height数组,按照sa[1],sa[2],……,sa[n]顺序计算,第i个串会使答案增加n-sa[i]-height[i]。题目链接:http://www.spoj.com/problems/DISUBSTR/代码:#include#include#include#include#include#includ原创 2014-02-12 14:34:16 · 680 阅读 · 0 评论 -
ural 1297 Palindrome(后缀数组)
题意:给出一个串,求最长回文子串,若有多个,输出第一次出现的。思路:把这个串后面加一个'$',把串翻转再复制一份到后面,然后求这个串的后缀数组,枚举最长回文串可能出现的位置,利用求lcp算最长回文串。代码:#include#include#include#include#include#include#include#include#include#include#原创 2014-02-14 11:51:25 · 676 阅读 · 0 评论 -
poj 3693 Maximum repetition substring(后缀数组)
题意:给出一个串,求这个串的重复次数最多的连续重复子串。思路:看论文搞的,后缀数组真难玩……代码:#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFF原创 2014-02-15 14:27:11 · 562 阅读 · 0 评论 -
poj 2774 Long Long Message(后缀数组)
题意:给出两个串,求这两个串的最长公共子串。思路:这两个串的最长公共子串一定是这两个串的两个后缀的前缀。可以把第二个串接到第一个串后面 ,中间用一个'$'隔开,求完后缀数组后,height[i]就有可能是答案,需要满足的条件是后缀i和后缀i-1分别属于这两个串。代码:#include#include#include#include#include#include#i原创 2014-02-15 15:17:43 · 648 阅读 · 0 评论 -
CF 346B Lucky Common Subsequence(LCS+KMP)
题意:给出两个串和一个病毒串,要寻找两个串的最长原创 2014-04-21 18:46:55 · 1355 阅读 · 4 评论 -
UVA 11996 Jewel Magic(伸展树+字符串hash)
题意:原创 2014-05-09 18:05:04 · 1310 阅读 · 0 评论 -
zoj 3533 Gao the String I(伸展树+字符串hash)
题意:给出一个长度为n的串,有原创 2014-05-13 22:49:06 · 1089 阅读 · 0 评论 -
zoj 3535 Gao the String II(AC自动机+DP)
题意:给出两个字符串集合原创 2014-05-14 22:00:10 · 809 阅读 · 0 评论 -
hdu 4787 GRE Words Revenge(分块+AC自动机)
题意:有n个操作,一个是学习一个原创 2014-06-16 14:07:21 · 1070 阅读 · 0 评论 -
ZOJ 3494 BCD Code(AC自动机+数位DP)
题意:给出一些禁止串,问从A~B的数字用BCD码表示,并且不包含禁止串的数有多少。思路:首先用禁止串建立AC自动机,然后数位DP……dp[i][j]表示在位置i,状态为j时的合法数字个数。另外,如果最高位是0,那么这是不能被算在内的,所以,要再用个值来表示前面是否全为0。代码:#include#include#include#include#include#inclu原创 2014-02-05 17:02:37 · 993 阅读 · 0 评论 -
hdu 3247 Resource Archiver(AC自动机+状压DP)
题意:给出m个病毒串,现在要把n个串合并,并且使得合并后的串中不包含病毒串。思路:不会做只好看题解……首先把病毒串和要合并的串都插入ac自动机,并做上相应的标记。然后bfs求出每个要从串i到串j要走的距离dis[i][j],然后就是状压dp的部分了。用dp[i][j]表示状态到i(一个用二进制表示的已走的串),并且当前是以串j为结尾所需要走的最小步数。代码:#inclu原创 2014-02-05 13:52:50 · 1270 阅读 · 0 评论 -
Trie、KMP、AC自动机小结
最近做了不字符串的题,做下小结吧~ 首先是Trie(也叫前缀树),Trie的结构并不难理解,Trie是个树形结构,它的每条边对应一个字符,每个节点对应一个字符串的前缀(根节点对应空串),将给定的字符串建立起一棵Trie以后,查找一个串的复杂度就是O(L)的。在对应的节点处可以做各种标记,根据不同的情况有不同的用法,代码也很好写,不过Trie的空间要求比较大……下面贴几道题。。。原创 2014-02-05 21:58:49 · 2503 阅读 · 1 评论 -
UVA 11732 strcmp() Anyone (Trie)
题意:给出N个串,问根据给出的程序两两比较的次数。思路:把所有串建成Trie,每次边插入边计算和前面的串比较的次数,然后加起来,所有串插进去以后就得到结果了。最开始每个节点开大小62的数组,发现各种TLE,应该是memset搞超时了,后来没办法,只好看着网上的做法用了左儿子右兄弟表示法,这东西之前在数据结构的书上看过,但是从来没用过。。。。代码:#include原创 2014-01-24 15:21:06 · 1077 阅读 · 0 评论 -
UVALive 4670 Dominating Patterns(AC自动机)
题意:给出n个串,再给出一个文本串T,问哪些串在文本串中出现的次数最多。思路:直接AC自动机搞,感觉还是比较裸的,每次遇到结尾的单词就给这个串出现次数+1。看完Trie和KMP感觉AC自动机还是蛮好理解的,之前看了看算导,感觉KMP和AC自动机都是一种有限自动机,把状态转移图弄好了就ok~代码:#include#include#include#includ原创 2014-01-26 11:40:02 · 1057 阅读 · 0 评论 -
hdu 3336 Count the string(KMP)
题意:给出一个字符串,求它所有的前缀与它匹配的次数的和。思路:KMP的应用……KMP构造的next数组中恰好包含着字符串的前缀的信息,因此,如果next数组没有转移到0,那么就说明他们有着公共的前缀,此时就是前缀和中间某一个串匹配上了。。。最后加上n个前缀本身就是答案……代码:#include#include#include#include#include#i原创 2014-01-25 15:03:51 · 834 阅读 · 0 评论 -
UVA 11488 Hyper Prefix Sets(Trie)
题意:有n个字符串,现在要求一个集合S,S中的串是给定的,他们的值为S中公共前缀的长度乘串的个数,求最大的这个值。思路:建Trie树的过程中可以统计当前前缀的串的个数,把所有串插入后就能得到结果了。。也是比较裸的题吧代码:#include#include#include#include#include#include#include#include原创 2014-01-24 16:08:56 · 942 阅读 · 0 评论 -
hdu 1358 Period(KMP)
题意:给出一个串,计算这个串每个前缀是否能形成循环,并输出位置和循环节长度。思路:这题明白next数组的性质以后就非常简单了。当next[i]!=0&&i%(i-next[i])==0时当前前缀有循环,循环节长度为i/(i-next[i])。代码:#include#include#include#include#include#include#inc原创 2014-01-25 18:26:07 · 783 阅读 · 0 评论 -
hdu 2594 Simpsons’ Hidden Talents(KMP)
题意:给出两个串s1和s2,求s1的一个最长的前缀,满足这个前缀是s2的后缀。思路:依然是kmp,不过和普通的匹配略有区别。用s1去匹配s2,一直匹配到结尾,返回这时候匹配成功的长度即可,注意,由于是要求一个后缀,所以中间如果匹配成功,那么当前指针j要转移到next[j]。代码:#include#include#include#include#include#原创 2014-01-25 19:29:28 · 919 阅读 · 0 评论 -
hdu 3746 Cyclic Nacklace(KMP)
题意:给出一个串,问最少在串末尾添加几个字符,才能让串中出现循环。思路:这题要很好的理解next数组的性质才行,构造完next数组以后,有这样一个性质:字符串的最小循环节的长度为len-next[len],如果len%(len-next[len])==0,那么字符串的最小周期为len/(len-next[len]) 。 这是如何得到的呢,先来看下下面的图:原创 2014-01-25 17:58:24 · 858 阅读 · 0 评论 -
hdu 2825 Wireless Password(AC自动机+状压DP)
题意:给出m个串,现在要生成一个长度为n的串,并且这个串至少包含k个给出的串,问生成串的方案数。思路:dp[i][j][k]表示前长度为i的串,当前状态为j,包含的串为k,k是一个二进制数,表示包含的串。把m个串构建成ac自动机以后就可以dp了。先预处理出每个状态的增加的串的个数num[u],则状态转移方程为dp[i+1][u][k|num[u]]+=dp[i][j][k];其中u为发生转移后原创 2014-02-02 23:02:54 · 881 阅读 · 0 评论 -
HDU 2296 Ring(AC自动机+DP)
题意:给出m个串,每个串都有一个价值,现在要构造一个长度小于等于n的串,使得其包含的价值最大,如果有两个串价值相同,则选择长度较小的,还相同选择字典序小的。思路:首先自然是构建ac自动机,然后dp的思路也是比较明显的,dp[i][j]表示长度为i的串在状态j的时候的最大价值。由于要求结果的串,写起来还不是很顺畅……用pa[i][j]记录到当前状态最小的串,然后各种比较……代码:原创 2014-02-03 12:28:44 · 1001 阅读 · 0 评论 -
hdu 2457 DNA repair(AC自动机+DP)
题意:给出n个串,现在有个长串,可以修改这个串的任意位置,要求这个串不包含这n个串,问最小修改次数。思路:首先构建AC自动机,用dp[i][j]表示长度为i的串,现在在状态j时最小要修改的次数,每次对于ATCG四个字符,如果状态可以发生转移,那么状态转移方程为dp[i+1][u]=min(dp[i+1][u],dp[i][j]+(c!=indx(str[i])));代码:原创 2014-02-03 13:27:22 · 882 阅读 · 0 评论 -
ZOJ 3228 Searching the String(AC自动机)
题意:给出一个串A,再给出n个查询,每个查询为一个串,询问这个串在A中出现的次数,另外,每个串有个type,type为0时这个串允许覆盖,否则不允许覆盖。思路:比较裸的AC自动机吧,对于不允许覆盖的单词,只要记录上一次查询到该串时的位置就行了。另外数据可能会有相同的串,因此用了map搞了下,时间感觉有点慢。。。代码:#include#include#incl原创 2014-02-03 18:16:04 · 901 阅读 · 0 评论 -
poj 1625 Censored!(AC自动机+DP+高精)
题意:要生成一个长度为M的串,有P个“禁止串”,即不能在生成的串中出现,问生成这样的串的个数。思路:用所有“禁止串”建立AC自动机,对于所有节点,我们可以知道添加一个字符是否会不合法,通过这个进行dp,用dp[i][j]表示,长度为i的串,处在状态j,那么dp[i][ch[j][c]]=add(dp[i][ch[j][c]],dp[i-1][j]); c为添加的字符。由于结果非常大,需要高精…原创 2014-02-02 19:20:58 · 985 阅读 · 0 评论 -
hdu 4821 String(枚举 + 字符串hash)
题意:原创 2014-08-18 16:21:23 · 774 阅读 · 0 评论