
字符串
FeBr2
(๑•̀ㅂ•́)و✧
展开
-
字典树(+DFS)——Watto and Mechanism ( CodeForces 514C )
题目链接: http://codeforces.com/contest/514/problem/C分析: 题目是先给出n个字符串和m个字符串,对于m个字符串中每一个字符串都可以在n个字符串中找到一个与之匹配(允许由一位字符的差异,但不允许超出或少于)。一看题目,就能想到是用n 个字符串建树,然后再搜索。题解: 比较难写的是这个DFS函数,先讨论字符串有没有到底,到底后无错误并且之后没有节点原创 2016-07-17 11:00:37 · 720 阅读 · 1 评论 -
字符串匹配(strstr)—— Bazinga ( HDU 5510 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5521分析: 给出n个字符串,按顺序标上label:1-n,求label最大的字符串并且满足在它之前至少存在一个字符串不不是它的子串题解: Get一个新的函数:strstr(char * str1, char * str2)返回值:若str2是str1的子串,则返回str2在str1的首次出原创 2016-10-01 15:02:15 · 509 阅读 · 0 评论 -
Booklist——ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛 A
题目链接: https://hihocoder.com/problemset/problem/1383分析: 给出很多行字符串,数量未知,最后一行为单个的0,结束一次样例。每一行字符串由 斜杠,空格,大写字母,数字组成。斜杠之前的字符串为目录,最后一个斜杠后的字符串为书名。要求把书名和字符串按字典序分别输出,目录在书名前。输入格式看题目样例。题解: 比赛时被坑死了,强行WA啊。。。 首先原创 2016-09-25 23:45:42 · 1003 阅读 · 0 评论 -
AC自动机 ( 静态建树模板 )——Substring ( UVA 11468 )
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2463分析: 给出 k 个模式串,再给出N个字符以及每个字符被选中的概率 pi,求选出N个字符组成长度为L的字符串且不含任何模式串的概率。 (出现的字符为 a-z, A-Z, 0-9)题原创 2016-07-30 13:32:21 · 440 阅读 · 0 评论 -
AC自动机 ( 动态建树模板 )——Keywords Search ( HDU 2222 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222分析: 给出n个单词建树,然后给出一个字符串,搜索字符串里出现了多少个单词。直接套用AC自动机模板就可以。AC自动机模板(含解析):const int k = 26;const int MAXN = 500100;struct Node{ Node* ch[k], *fai原创 2016-07-29 14:42:29 · 629 阅读 · 0 评论 -
AC自动机 ( 模板题啊 )——Dominating Patterns ( UVA 4670 )
题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671分析: 给出N个字符串建树,然后给出一个母串,求出再母串中出现次数最多的子串,如果有多个,就全输出。题解:模板题!!因为要计算出现次数,可以考虑先用map存储一些所有的原创 2016-07-29 22:01:05 · 375 阅读 · 0 评论 -
字典树(需要删除操作)——DNA Prefix ( LOJ 1224 )
题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1224分析: 一开始以为是一道非常裸的字典树,只不过加了个前缀×节点值,后来内存超了几次,才发觉每次需要删除字典树。关键步骤:删除字典树代码:void delete_tree(node * root){ //递归删除 for(int i=0; i<k;原创 2016-07-15 18:48:24 · 580 阅读 · 0 评论 -
Kmp(求字符串公共循环节数目)——Common Divisors ( CodeForces 182D )
题目链接: http://codeforces.com/contest/182/problem/D分析: 题意为给出两个字符串,求其公共循环节的数目,那么首先要求出其公共最小循环节!这里需要用到Kmp算法中的SetNext()函数来求循环节。关键步骤:SetNext()函数:(将第一个重复位之前的所有位的值赋为-1,然后第一个重复位从0开始,之后匹配失败也赋值为0)void SetNext原创 2016-07-16 16:48:49 · 873 阅读 · 0 评论 -
AC自动机——病毒侵袭 ( HDU 2896 )
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2896分析: 给出N个子串建树,再给出M个母串来查询每个母串含有哪几个子串。还是一只自动AC机~题解: 直接套用AC自动机模板,不过需要修改几个地方:建树: 2.void insert(char *s){Node * t = root;for(;*s;s++){ int x原创 2016-07-29 16:57:21 · 443 阅读 · 0 评论 -
AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065分析&&题解: 这持续侵袭的病毒还不如第一次病毒难,直接模板改改就好:AC代码:#include <cstdio>#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#includ原创 2016-07-29 19:02:35 · 459 阅读 · 0 评论 -
最长回文子串:Manacher算法
详解见: http://blog.youkuaiyun.com/xingyeyongheng/article/details/9310555解析: 首先预处理字符串,在字符串首尾和每两个字符之间插入特殊符号(例如’#’)使字符串变成奇数长度,为了进一步减少编码复杂度,还可以再字符串开始再加入另一个特殊字符,这样就不用特殊处理越界问题了。然后利用计算字符串的P[i]数组来记录以字符S[i]为中心的最长回文子原创 2016-07-15 11:07:48 · 500 阅读 · 0 评论 -
DP+KMP——Another Meaning ( HDU 5763 ) ( 2016 Multi-University Training Contest 4 1001 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763分析: 每次给出两个字符串A和B,B可以被替换成*,在A中查找B,每一个B都可以进行替换,求一共能把A替换成多少种字符串。题解: 因为A字符串的长度为100000,所以答案最多会有2的100000这么多种,直接KMP会Bomb,ShaKaLaKa,因此需要用DP来做:DP[i]表示到第i原创 2016-07-28 21:02:23 · 386 阅读 · 0 评论 -
扩展KMP ( Next数组 )——Simpson's Hidden Talents ( HDU 2594 )
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2594分析: 给出两个字符串S1,S2,求出一个最长子串(既是S1 的前缀又是S2的后缀),一开始是打算用完整的扩展KMP去做,但是结果迷之WA,后来改成合并字符串,把S2接S1后面,然后获取整个字符串的Next数组来做。题解:从strlen(s1)的地方开始遍历Next数组,这个时候找S[str原创 2016-07-28 11:08:26 · 588 阅读 · 0 评论 -
扩展KMP学习
模板转自: http://blog.youkuaiyun.com/dyx404514/article/details/41831947 (侵删)(扩展KMP的详细介绍也在里面)next数组计算const int maxn=100010; //字符串长度最大值 int next[maxn],ex[maxn]; //ex数组即为extend数组 void GETNEXT(char *str)转载 2016-07-28 09:51:06 · 556 阅读 · 0 评论 -
KMP(内含next数组讲解) —— 剪花布条 ( HDU 2087 )
关于KMP算法前缀next最同俗易懂的解释请看: http://blog.youkuaiyun.com/yearn520/article/details/6729426next数组代码:void SetPrefix(const char *Pattern, int prefix[]){ int len=CharLen(Pattern);//模式字符串长度。 prefix[0]=0;原创 2016-07-14 18:13:07 · 425 阅读 · 0 评论 -
暴力交叉匹配——La Vie en rose ( HDU 5745 )(2016 Multi-University Training Contest 2 1012)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5745分析: 给两串字符,一串目标字符,一串匹配字符,匹配字符可以前后交换,然后输出匹配位置。过的人很多,所以应该就是暴力搜索。题解: 由两种匹配方式,直接匹配,如果不行,可以和后一个位置匹配(因为匹配字符串可以前后交换,但每一个字符只能交换一次)。所以这里加一个判断直接暴力搜索AC代码:原创 2016-07-22 15:06:35 · 469 阅读 · 0 评论 -
Kmp找字符串循环节——Period ( POJ 1961 )
题目链接: http://poj.org/problem?id=1961分析: 给出一个字符串长度为N,从左变开始取2~N个字符出来构成一个新字符串,若新字符串能被一个最短的循环节构成则输出新字符串的长度和循环节循环次数。题解: 直接用Kmp里的SetNext()函数,求出该字符串里每一个字符的重复位置,用2~N长度减去以该长度为下标对应Next数组里的值即重复位置得到该两个重复出现字符间原创 2016-07-15 15:09:46 · 4078 阅读 · 0 评论 -
字典树——统计难题 ( HDU 1251 )
字典树:定义: 字典树(Trie树)是一种树形数据结构,其作用是存储多个字符串,并可以自动按照字典序排好。该算法的时间复杂度为O(n),空间复杂度为O(nk),其中n为所有字符串的和,k为所有可能出现的字符的个数。实现方法: 树上的每个节点代表了一个字符串,每个节点最多有k个孩子,第k个孩子代表的字符串为原结点的字符串后接上第k个字符构成。Node结点代码:struct node{原创 2016-07-15 16:40:10 · 599 阅读 · 0 评论 -
记忆化搜索(字符串)——Kickstart 2017(Google Code Jam) A Round #B
题目链接: https://codejam.withgoogle.com/codejam/contest/8284486/dashboard#s=p1题意: 给出2个字符串A和B,判断2个字符串是否相等,字符串中可能含有’*’符号,这个符号可以与0~4个任意字符匹配上。分析: 我们可以发现一点就是,对于每一个’‘,我们可以选择让它匹配0~4个字符再对接下来的字符进行比对,那么我们可以直接搜索它分原创 2017-03-06 21:13:28 · 1419 阅读 · 0 评论