字符串处理
文章平均质量分 59
iYUNDI
iYUNDI
展开
-
[HDU 3065]病毒侵袭持续中[AC自动机][模板题]
很久没有自己敲一个题了,这道又WA得我内!牛!满!面!啊......不过还是得这样才印象深刻.记得检查输入是否正确.不要焦躁.AC了之后感觉忽然有了力量~题意:给出许多模式串,一个源码,求源码中都有哪些模式串出现了,分别出现几次.思路:AC_Automation中,注意模式串之间有重叠的情况,就是无论是否匹配到了当前串的末尾,都要借助一个tmp指针往回找一遍,看看别的链原创 2013-08-06 12:08:22 · 897 阅读 · 0 评论 -
[HDU 3336]Count the String[kmp][DP]
题目是求所有前缀串的匹配次数之和, 那么可以先求前缀串 Si 在整个串中的匹配次数, 再加和.可设dp[ i ]为前缀串 Si 在总串中出现的次数.dp[i] = 1;dp[next[i]] += dp[i];还有另一种思路:可以将前缀的匹配次数视为包含的前缀个数.最终的问题是求s中 (设每一种前缀i包含的前缀个数Fi ) ΣFi .dp[i]为前缀串s[0...i]包含的前缀个数的新增数目(相对于前缀串s[0...i-1]).原创 2013-09-13 16:23:24 · 977 阅读 · 0 评论 -
[HDU 2594]Simpsons’ Hidden Talents[kmp求公共前后缀]
题意:求两个串s1, s2中s1的前缀与s2的后缀的最长公共部分.思路:next数组应用.注意先判断主串是否结束, 再判断模式串是否结束. 1WA>#include #include #include const int MAXN = 50005;int next[MAXN],ans;char s1[MAXN];char s2[MAXN];//15MS 492原创 2013-09-13 21:45:25 · 1271 阅读 · 0 评论 -
[HDU 3746]Cyclic Nacklace[kmp求周期]
题意:求从末端补足至少两周期的最小项数.思路:kmp求循环周期应用#include #include const int MAXN = 100005;int next[MAXN];char s[MAXN];//125MS 688Kvoid prekmp(){ next[0] = -1; int j = -1; for(int i=1;s原创 2013-09-13 16:49:18 · 984 阅读 · 0 评论 -
[HDU 2087]剪花布条[kmp非重叠匹配]
题意:求一个长串最多可以被分成几个子串.思路:kmp, 只是不能重叠. 匹配成功后 j 回溯到 -1 而不是到 next [ j ]#include #include const int MAXN = 1005;int next[MAXN],ans;char s[MAXN];char a[MAXN];//0MS 204Kvoid prekmp(){原创 2013-09-13 17:42:45 · 1260 阅读 · 0 评论 -
[HDU 4119]Isabella's Message[字符串模拟]
题意:给出一个表格和一块蒙版, 露出的字母按一定顺序读出, 蒙版旋转, 初始位置不定.只认识给定的一些词. 问可辨识的短语. 多种情况输出字典序最小的.思路:字符串处理的模拟题.主要是有几步:1. 读入. 2. 得到蒙版四个方向读出的串.3. 将这四个串以四种方式串联.4. 消除前导空格, 合并中间连续的多个空格.5. 判断是否是认识的词.6. 将字原创 2013-10-01 15:42:42 · 1618 阅读 · 0 评论 -
[poj 1699]Best Sequence[kmp][DP]
题意:n个串,构造出一个最短的串,使得这n个串每个串都是这个串的子串,输出的串的长度思路:1.预处理出一个串的前缀最多匹配多少长度的另一个串的后缀2.设dp[i][j]表示i状态的总串,最后一个子串为j时所构造的字符串的最短长度,每次枚举一个子串进行转移#include#include#include#include#include#includeusi原创 2013-10-04 10:12:41 · 1441 阅读 · 0 评论 -
[zoj 3587]Marlon's String[kmp]
题意:Return the amount of tetrad (a,b,c,d) which satisfySa..b + Sc..d = T , a≤b andc≤d.思路:正反两次kmp,匹配出最长前后缀的匹配次数.再进行统计.注意的是统计的方法:因为记录的是最长前后缀, 而统计时要将所有的前后缀都要算进去, 相当于每加一次, 都要沿着next回溯到-1.原创 2013-09-19 17:28:53 · 1324 阅读 · 0 评论 -
[HDU 2896]病毒侵袭[AC自动机]
题意:多模式串匹配,输出模式串的ID思路:典型AC自动机.用向量存储答案ID#include #include #include #include #include #include using namespace std;const int MAXL = 130;/*inline int GetID(char x){ return x;}*/原创 2013-09-19 19:59:51 · 1039 阅读 · 0 评论 -
[HDU 1358]Period[kmp求周期]
题意:每一个power前缀的周期数(>1).思路:kmp的next. 每一个前缀都询问一遍.#include #include const int MAXN = 1000005;int next[MAXN];char s[MAXN];//93MS 5092Kvoid prekmp(){ next[0] = -1; int j = -1; f原创 2013-09-13 17:16:57 · 1097 阅读 · 0 评论 -
[HDU 1711]Number Sequence[kmp]
数字kmp.pure water.#include using namespace std;const int MAXN = 1000005;const int MAXM = 10005;int n,m,a[MAXN],b[MAXM],k;int next[MAXM];void prekmp(){ next[0] = -1; int j = -1;原创 2013-09-12 16:43:59 · 765 阅读 · 0 评论 -
[HOJ 2353]Card Hands[Trie]
Trie插入一个串:void insert(char *s, int w) {//这样就实现了字符作下标↓int cur = 0;//0是根节点,里面存放着一些指针, 存放的位置代表儿子的id,//值为儿子的地址 for (int i = 0; s[i]; i++) {//地址是顺序排列的,和节点数保持同步-1 if (!chd[cur][ID[s[i]原创 2013-08-02 17:36:16 · 851 阅读 · 0 评论 -
[POJ2406] Power Strings[KMP]
题意:判断一个字符串是由几个子串重复连接而成.思路:字符串的自身匹配,考虑用KMP的next函数.假设数组下标从0开始,Next[i]数组的值k表示B数组1那么考虑,对于一个power string来说,next[len-1]就是len-1-[重复串长].非power string的next[len-1]就不满足.也就是把重复串长提取出来的话,不能整除总长.那么n=1.想出这个公式原创 2013-08-02 17:33:53 · 801 阅读 · 0 评论 -
[HDU 3336]Count the String[kmp]
题意:给出一个字符串,求其所有前缀串为模式串时匹配成功的次数.思路:就和AC自动机那题处理模式串重叠的方法一样,每到一处,回溯到根检查一遍.#include using namespace std;const int MAXW = 200005;const int MOD = 10007;char W[MAXW];int n;int next[MAXW]原创 2013-08-07 21:40:00 · 707 阅读 · 0 评论 -
[POJ3461] Oulipo[KMP基础]
KMP[对于理解来说重要的语句] [理解与注释] [非重要语句]假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越好),现在需要转载 2013-08-02 17:28:40 · 705 阅读 · 0 评论 -
[poj 2752] Seek the Name, Seek the Fame[KMP]
题意:求字符串S的, 既是前缀串, 又是后缀串的子串.思路:next数组的应用.#include #include #include using namespace std;const int MAXN = 400005;char s[MAXN];int next[MAXN];int stack[MAXN],top,n;void prekmp(){ nex原创 2013-09-09 10:54:49 · 935 阅读 · 0 评论 -
[poj 3450]Corporate Identity[暴力枚举子串]
题意:和poj 3080相同.同样是暴力.又是循环边界的小毛病...#include #include //372K 110MSconst int R = 4005;const int C = 205;char s[R][C];char t[C],ans[C];int n;int main(){ while(scanf("%d",&n)原创 2013-09-13 11:27:59 · 1087 阅读 · 0 评论 -
[POJ 2185]Milking Grid[kmp]
优化到79MS.求可以重复地平铺, 来构造出整个矩阵的矩形单元的最小面积.小方格的尺寸并不一定要均匀地分割大矩形的尺寸.自己实现一下:统计所有可能的覆盖子串的时候也可以利用next 数组, len - 1 - next [ len - 1 ] 本身就忽视了结尾的不完整项(只是循环的字段视为右对齐, 但是长度不影响).用这个公式算出的一定是最小覆盖子串, 那么求出覆盖次数后, 相乘便得到最大覆盖子串, 中间的均以整倍递增.原创 2013-09-13 09:55:09 · 926 阅读 · 0 评论 -
[poj 3080]Blue Jeans[暴力枚举子串]
题意:找出DNA序列中最长公共子串, 长度不小于3, 否则输出"no significant commonalities". 若等长有多个, 取字典序最小的.思路:若是最长公共子串, 每个串中都有, 因此可以只枚举第一个串(由于数据范围小, 先不考虑优化问题).长度从小到大枚举(若是小的都不满足, 直接跳出判结果; 反之, 则需要一直试探, 找到第一个满足的长度即最大长度)id原创 2013-09-13 10:53:24 · 1110 阅读 · 0 评论 -
[HDU 2222]Keywords Search[AC自动机]
题意:多模式串匹配.思路:AC自动机,注意回溯.优化fail建立过程.#include #include #include using namespace std;const int MAXL = 1000005;const int MAXK = 52;const int MAXNODE = 240005;const int MAXCHD = 26;int chd[MAXN原创 2013-09-19 19:55:29 · 1051 阅读 · 0 评论