
ACM-字符串
羁绊残阳
四川大学计算机科学与技术
展开
-
hdu 5340 Manachers + 枚举
题意:给你一个字符串问能否拆分为三个回文字符串?能就输出yes,否则输出no。知识补充:最长回文子串算法(Manacher算法):求解最长回文子串的线性时间复杂度算法,主要是通过中心扩展的方法极大地避免了重复计算。实现如下:为了避免对字符串奇偶数的讨论,先对字符串做预处理如下:规则为在字符间和两边插入'#'字符,为了避免越界处理,最两边插入'^'和'$'字符。原本字符串为:asd预处理后为:原创 2015-08-04 11:41:53 · 497 阅读 · 0 评论 -
hdu3065 AC自动机
/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 四 5/ 5 15:51:27 2016 *File Name* : jy.cpp**Problem**:**Analyse**:**Code**:*****原创 2016-05-05 16:21:19 · 540 阅读 · 0 评论 -
zoj3430 AC自动机模拟
/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 五 5/ 6 16:14:59 2016 *File Name* : jy.cpp**Problem**:**Analyse**:此题难就难在编码,还有题意问的原创 2016-05-06 18:28:22 · 954 阅读 · 0 评论 -
poj2406 扩展kmp
如果kk是字符串的循环节,str.substr(0)==str.substr(k)str.substr(0) == str.substr(k) 这里恰好是最长前缀和后缀,用extkmp来正好. 求最小循环节,且这个循环节长度要能整除slen./**********************jibancanyang************************** *Author*原创 2016-05-07 22:09:39 · 759 阅读 · 0 评论 -
poj2752 扩展kmp
/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 六 5/ 7 21:17:06 2016 *File Name* : .cpp**Problem**:扩展kmp **Analyse**:**Code**:原创 2016-05-07 22:43:37 · 599 阅读 · 0 评论 -
hdu4513 最长递增回文序列 manacher + dp
Problem: 定义回文且单增为完美队形,求完美队形的最大长度. Analyse: - 用manancher处理处,P数组. - 用dp求出以i结尾的单调递增序列长度. - 换算取最小值 Code:/**********************jibancanyang************************** *Author* :jibancanyang *原创 2016-05-09 09:59:20 · 706 阅读 · 0 评论 -
soj [Union Training I] N AC自动机 + dp
Problem: 给你m个字符串,问长度为n,至少包含其中一个字符串为子串的字符串的个数. Analize: - 将问题转化为26k−不包含任意子串的个数26^k - 不包含任意子串的个数,这里用AC自动机来建立禁止字符串. - 所有节点的子节点开始都为根节点,在添加禁止字符串的过程中扩展 - 利用fail指针来扩展禁止字符串,也就是当前字符串的fail指针的字符串如果都是禁止字符串那么当原创 2016-05-09 20:18:43 · 859 阅读 · 0 评论 -
hihocoder #1015 kmp
kmp比较裸的#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <cmath>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x)原创 2016-06-13 18:02:39 · 287 阅读 · 0 评论 -
hihocoder #1032 manacher
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <cmath>using namespace std;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout <原创 2016-06-14 10:02:16 · 236 阅读 · 0 评论 -
SCU2016-05 I题 trie图 + 大数dp
File Name : 这很trie图建立转移规则,然后dp。 大数模板Code:/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一 5/ 9 11:49:40 2016*****************原创 2016-07-14 17:23:54 · 1058 阅读 · 0 评论 -
#hihocoder 1036 trie图
题意:本质是在前缀trie树上,加上每个节点的后继边,变成trie图来完成AC自动机的匹配。#include <cstdio>#include <queue>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <cmath>using namespace std;#def原创 2016-07-18 15:10:15 · 294 阅读 · 0 评论 -
Codeforces Round #362 (Div. 2) F. Legen... (AC自动机 + 矩阵快速幂)
题意:有很多模式串每个都有自己的价值,然后求长度为ll的原串,让所有它的子串价值最大。分析:首先想到最直接的我们肯定要建立一个trie图来形容这个自动机,这个trie图是一个有向图,每一个节点代表一个状态(就是一串前缀字符串prepre,然后在这些状态之后添加一个字符就转移到新的状态。 然后利用这个状态来进行动态规划,定义dp[l][i]dp[l][i]为当前长度为ii的字符串,末尾的后缀状态为t原创 2016-07-18 20:54:39 · 485 阅读 · 0 评论 -
hdu 5763 kmp + dp
分析: 乍一看以为很容斥,其实把它拆分成dp很容易解决重复. 根据数据量显然是一个一维o(1)o(1)转移的dp. 定义dp[i]dp[i]表示以ii结尾的种数,考虑依次添加字符,如果以当前结尾的后缀不构成模式串显然种数不增加,否则加上前面部分. kmp简化的写法很强势.#include <iostream>#include <cstdio>#include <cstring>#inc原创 2016-07-29 17:12:04 · 296 阅读 · 0 评论 -
poj 2217 后缀数组求最长公共子串
分析:考虑求一个串自身的最长公共子串的长度,就是最大的高度数组值(因为和一个后缀的最长的公共子串一定是和它相邻的最大,然后依次递减)(所以我们求任意后缀之间的最长公共前缀长度,可以对高度数组RMQ的方法) 这样,我们只需要把两个字符串拼接成一个大的,中间加一个一定不会出现的特殊字符。然后前后名次求分别在两个不同部分的子串的高度数组的最大值。#include <iostream>#include原创 2016-07-30 23:55:06 · 437 阅读 · 0 评论 -
hdu 5769 后缀数组
分析:首先知道求不同子串个数的做法,就是,每个后缀减去它的高度数组。这相当于一种划分,然后减去交叉部分。 这里多了一个含有字符x,求每个字符后面第一个x出现的位置,再去减去交叉部分和不含x部分的较大值即可。#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>u原创 2016-07-31 00:39:18 · 586 阅读 · 0 评论 -
hdu 5785 manacher回文处理 + 扫描线
分析:首先考虑遍历所有的两头的i,ki,k,然后去找他们中间的一个点cc,让这个点把str[i...k]str[i...k]且成两段回文串。 这样是可行的,但是复杂度枚举两头已经是O(n2)O(n^2)了。然后考虑换一个思路,枚举所有的中间的隔代cc,然后以cc为隔代的满足条件的所有回文串的两头。 这样发现,用所有以cc左边元素为结尾的回文串的左边界和乘以以cc右边元素为开始的所有回文串的右原创 2016-08-04 11:05:56 · 428 阅读 · 0 评论 -
hdu1010 扩展KMP求字符串最小循环节
Problem:扩展kmp求字符串最小循环节 Analyse: 如果kk是字符串的循环节,str.substr(0)==str.substr(k)str.substr(0) == str.substr(k) 这里恰好是最长前缀和后缀,用extkmp来正好./**********************jibancanyang************************** *Author原创 2016-05-07 21:27:59 · 964 阅读 · 0 评论 -
hdu2896 AC自动机
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#inc原创 2016-05-05 15:39:23 · 353 阅读 · 0 评论 -
hdu4763 扩展KMP
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : 五 4/29 13:19:28 2016 *File Name : hdu4763.cpp *Problem:extKMP *Get:extKMP算法的extend数原创 2016-04-29 13:52:39 · 751 阅读 · 0 评论 -
soj 3336 Diary(trie树)
@(K ACMer)题意: 给你一个大字符串,是日记的编码.每个女生的名字对应一个长度为10的编码.求在日记中出现次数最多的编码所对应的名字分析: 典型的trie树的应用,字符串计数.先把日记建立trie树,然后去查,每个字符串出现多少次即可.#include <iostream>#include <cstdio>#include <cstring>#include <set>#incl原创 2015-11-08 20:23:38 · 403 阅读 · 0 评论 -
#soj 3076 相同字符串(tire树)
@(K ACMer)题意: 依次给 n 个全部由小写字母构成且长度不超过 300 的非空字符串求每个字符串之前的字符串中与当前字符串完全相同的个数. 分析: 一种思路: 很直接的可以用map来查,但是map节点之间比较的时候时间比较长,就把字符串hash一下,开始裸的hash wa了,优化了hash函数加了个长度相关也就过了. 这里主要学习trie树实现的思路: 树节点维护的是当前节点为原创 2015-11-08 03:16:47 · 368 阅读 · 0 评论 -
soj 3596 Article Decryption(trie树 + dp)
@(K ACMer)题意: 给你一些单词,和一个长字符串s,s是由这些单词组成的,总共有多少种组成的可能? 分析: 问有多少种可能显然的dp,很容易的想到定义dp[i]dp[i]为s前i个字符形成的字符串最多有多少种可能,则有转移方程:dp[i]=∑j=0i−1isword(j+1,i) ? dp[j] : 0dp[i] = \sum _{j = 0}^{i - 1} isword(j +原创 2015-11-08 16:29:07 · 429 阅读 · 0 评论 -
poj1200 Crazy Search
@(K ACMer)题意:给你一个字符串,其中由nc个不同的字符组成.问你它的长度为n的不同的子序列有多少个?分析:咋一看最直接的想法就是每一个子串都加入set中,然后最后看set中有多少个字符串就可以了.复杂度是O(n∗strlen∗logn)O(n*strlen*log^n)显然超时.那么有什么优化呢?我们可以看出每次往set中添一个字符串,这个字符串会和已经有的字符串比较是否相等,比较的原创 2015-10-11 17:38:45 · 491 阅读 · 0 评论 -
soj 3014: Seek the Name, Seek the Fame (字符串hash)
@(K ACMer)题意: 对于一个字符串s,找出所有相同的前缀后缀长度. 分析: 一看就可以用字符串hash来搞,首位两端维护一个hash值,如果该hash值相等就说明字符串相同.字符串hash代码#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#inc原创 2015-11-12 13:29:10 · 331 阅读 · 0 评论 -
soj 3296: Windy's S
@(K ACMer)题意: 求所给字符串的循环表示的最小字典序. 分析: 循环字符串的最小表示集裸题. 最朴素的方法是O(n2)O(n ^2)的复杂度,显然超时.这里用了一个很巧妙的性质来剪枝,使复杂度降到O(n)O(n).字符串循环的最小独立集这里引入同构的知识,我们有树的同构,图的同构,和字符串的同构.其所为同构是指他们在进行一些可取的等效操作(比如树和图的旋转,字符串的移位)后是相同的原创 2015-11-13 22:54:17 · 413 阅读 · 0 评论 -
soj 2307 String Matching(KMP)
@(K ACMer)KMP裸题一道…#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#include <cstdlib>#includ原创 2015-11-15 20:50:05 · 288 阅读 · 0 评论 -
Codeforces 596E Wilbur and Strings(序列自动机)
@(K ACMer)题意: 在一个n∗mn*m的图上,每个空格写着0−90-910个数字中的一个.有两个长度为10的数组a1,a2...ana_1,a_2...a_nb1,b2,b3,...bnb_1,b_2,b_3,...b_n,表示转移向量.当走到一个格子(x,y)(x,y)上时,如果它上面的数字为t,他必须走到(at+x,y+bt)(a_t + x, y + b_t)格子去(除了,加上偏移量原创 2015-11-25 17:45:38 · 2026 阅读 · 2 评论 -
Codeforces 603A Alternative Thinking(字符串规律)
@(K ACMer)题意: 给你一个01字符串,你必须翻转其中的一个子串,问执行该操作后该字符串的最长交替子序列长度为多少? 分析 首先显然翻转整个字符串该字符串的01子序列长度不变,所以最次也是不变不会减小 然后我们队字符串进行压缩把连续的0和,连续的1压缩为一个,并记录它们各自压缩前的连续字符的个数。 显然交替子序列的个数最多增加两个,我们定义"00","11"这样的字符串叫做对。发现原创 2015-12-02 11:07:53 · 1005 阅读 · 0 评论 -
LeetCode 211.Add and Search Word - Data structure design(trie树)
题意:创建一个单词库,支持两种操作,给库里面加入新单词和查询某单词是否在库中,但是注意用’.’来做通配符,可以代替任意字符. 分析:trie树的改造.主要是通配符的处理.这里把搜索函数处理了一下,用递归实现,当配件通配符号的时候遍历它的所有26个分枝来求满足条件的.code:class WordDictionary {private: struct node { int原创 2016-03-23 20:29:09 · 307 阅读 · 0 评论 -
hdu3068 manacher算法模板
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : 三 4/27 09:43:05 2016 *File Name : jy.cpp *Problem: *Get:***********************159原创 2016-04-27 10:42:30 · 271 阅读 · 0 评论 -
poj3080 枚举+ kmp
Problem:poj3080 枚举+ kmp 求mm个子串的最长公共子串. Analyse: - 根据第一个串,枚举字串,然后对于后面的每一个用kmp来匹配,复杂度O(n3m)O(n^3m)./**********************jibancanyang************************** *Author* :jibancanyang *Create原创 2016-05-10 14:30:08 · 475 阅读 · 0 评论 -
hdu 2087 水kmp
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : Thu 28 Apr 2016 01:21:08 PM CST *File Name : test.cpp *Problem *Get:***************原创 2016-04-28 13:43:52 · 336 阅读 · 0 评论 -
hdu 1711 水kmp
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : Thu 28 Apr 2016 01:21:08 PM CST *File Name : hdu1711.cpp *Problem: 水kmp *Get:******原创 2016-04-28 14:03:14 · 320 阅读 · 0 评论 -
hdu1358 kmp的next数组求循环节
题意:往字符串两端添加字符,让它的循环节个数大于等于2. 分析: 首先明白nexts[i]表示的是p[i]之前的字符串中,最大的相同前缀后缀长度. 注意:这里的前缀后缀长度必须小于ii的,要不然无法继续匹配, 例如:对于aaaaaa它的相同前缀后缀的最大值必须小于3,尽管只直观上可以等于3,但是等于3,在kmp的时候无法前进了.这里恰到好处的利用了一个字符串求其循环节的方法:就是把原串整原创 2016-04-29 01:10:53 · 365 阅读 · 0 评论 -
hdu3294 manacher算法
/**********************jibancanyang************************** *Author :jibancanyang *Created Time : 五 4/29 09:56:27 2016 *File Name : hdu3294.cpp *Problem:简单manacher+替换 *Get:********原创 2016-04-29 10:18:40 · 313 阅读 · 0 评论 -
hihocoder 第120周 后缀数组 + 单调队列
分析:求出高度数组,用单调队列维护区间最小值。高度数组的区间最小值的意义就是这些排名相邻的后缀的最长公共前缀。实际上是把所有字符串划分为后缀。这里的是可重叠子串。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define pr(x) cout <<原创 2016-10-19 11:04:38 · 507 阅读 · 0 评论