字符串
文章平均质量分 73
leolin_
这个作者很懒,什么都没留下…
展开
-
【后缀数组求最长回文子串】POJ 3974
MLE了...囧,不过算法是正确的#define maxn 2000010int wa[maxn],wb[maxn],wv[maxn],wss[maxn];int r[maxn],sa[maxn];int cmp(int *r,int a,int b,int l){return r[a]==r[b] && r[a+l]==r[b+l];}void da(int *r,int *s原创 2012-01-29 20:11:21 · 1304 阅读 · 1 评论 -
【KMP O(n)算法详解】
转自matrix67.com如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串转载 2011-11-11 10:10:54 · 2327 阅读 · 0 评论 -
【后缀数组求不相同的子串的个数】spoj694 spoj705
spoj694 http://www.spoj.pl/problems/DISUBSTR/spoj705 http://www.spoj.pl/problems/SUBST1/两道题差不多,只是705的数据大一点而已,用倍增算法没压力,继续套模板贴一下罗大牛的思路,说白了就是∑每个后缀长-height。不相同的子串的个数(spoj694,spoj705)给定一个字符串,求不相同原创 2012-01-29 11:07:21 · 758 阅读 · 0 评论 -
【后缀数组求可重叠的k 次最长重复子串】POJ 3261
先二分答案,然后将后缀分成若干组,判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。这里有一个地方要注意的,就是计数每一组的时候cnt初始值为1,因为height数组是两两之间比较的,当有1个height满足后就相当于有两个后缀满足。#define N 1000010#define maxn 20010原创 2012-01-29 00:38:15 · 520 阅读 · 0 评论 -
【后缀数组求不可重叠最长重复子串】POJ 1743
不可重叠最长重复子串(pku1743)给定一个字符串,求最长重复子串,这两个子串不能重叠。算法分析:这题比上一题稍复杂一点。先二分答案,把题目变成判定性问题:判断是否存在两个长度为k 的子串是相同的,且不重叠。解决这个问题的关键还是利用height 数组。把排序后的后缀分成若干组,其中每组的后缀之间的height 值都不小于k。例如,字符串为“aabaaaab”,当k=2 时,后缀分成原创 2012-01-28 22:25:07 · 1537 阅读 · 0 评论 -
数据结构之后缀数组
数据结构之后缀数组1. 概述后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。本文大部分内容摘自参考资料[1][2]。2. 后缀数组2.1 几个概念(1)后缀数组SA 是一个一维数组,它保存1..n 的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA[转载 2011-05-15 21:07:00 · 730 阅读 · 0 评论 -
【DP生成回文字符串的最小插入字符数】POJ 1159
注意优化空间复杂度,没用滚动数组前49776K,使用后188K——这就是差别!!!转移方程:if (str[i] == str[j]) dp[i][j] = dp[i-1][j-1];else dp[i][j] = 1 + min(dp[i+1][j],dp[i][j-1]);#include #include #include #include #原创 2011-11-12 17:48:10 · 784 阅读 · 0 评论 -
【KMP】HDU 3336
有时KMP简单应用,不解释。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespac原创 2011-11-12 02:01:02 · 376 阅读 · 0 评论 -
【KMP求两子串前后最长公共子缀】HDU 2594
开始SB地暴力,就是枚举a串,结果SB地TLE。。。后来发现我真的很SB,完全没有利用好kmp的优美性质,在kmp的主程序中(主程序跟预处理程序应该分得清吧,虽然他们长得好像),每次查找的结果就是得出b[i]对应a串中最长的前缀长度j,具体是下面程序中标记部分。#include #include #include #include #include #include #incl原创 2011-11-12 01:23:04 · 800 阅读 · 0 评论 -
【KMP】POJ 2752
理解好kmp算法中的p数组的含义(常用next数组,但我习惯命名为p^_^),p数组含义是第i个字符跟前缀中最长的k个相同,所以从最后一个一直往回找j = p[ j ],就是结果,注意从小到大输出。#include #include #include #include #include #include #include #include #include #includ原创 2011-11-11 12:57:49 · 395 阅读 · 0 评论 -
【后缀数组求重复次数最多的连续重复子串】SPOJ687 POJ3693
spoj 687#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define原创 2012-01-30 04:09:05 · 687 阅读 · 0 评论 -
【字符串最小表示】HDU 3374
http://acm.hdu.edu.cn/showproblem.php?pid=3374原来这个东西叫最小表示。。。方法:分别求一次最小表示和最大表示求出首字母位置,然后下面就比较暴力,用两次kmp求出最大串和最小串出现的次数#define N 1000010char str[N],ss[N*2],lin[N];int p[N];int Minrp(char *s, in原创 2012-02-23 00:25:08 · 659 阅读 · 0 评论 -
【后缀数组与统计】
后缀数组向来很强大,其中它的统计功能是一方面。下面以两道题目为例说明一下如何使用强大的后缀数组进行统计【例1】POJ 3415http://poj.org/problem?id=3415这题是求两串中长度>=K的子串的个数(可重复)做法:首先最正路的做法就是用后缀数组把两个串链接起来,中间加个没出现过的字符,对新串求heigh数组,我们先对遇到A的可以对前面与B的lcp进行相加,同原创 2012-04-10 10:18:50 · 881 阅读 · 0 评论 -
【后缀数组求最长公共子串】POJ 2774
根据罗的论文,两个串的中间要加一个ascii码比任何字母都小的字符最长公共子串(pku2774,ural1517)给定两个字符串A 和B,求最长公共子串。算法分析:字符串的任何一个子串都是这个字符串的某个后缀的前缀。求A 和B 的最长公共子串等价于求A 的后缀和B 的后缀的最长公共前缀的最大值。如果枚举A和B 的所有的后缀,那么这样做显然效率低下。由于要计算A 的后缀和B 的后缀的原创 2012-01-28 19:39:15 · 782 阅读 · 0 评论 -
【后缀数组模板】
hight数组是灵魂!倍增算法O(nlgn)#define maxn 100010int wa[maxn],wb[maxn],wv[maxn],wss[maxn];//论文模板的ws竟然跟g++里的关键字冲突!int r[maxn],sa[maxn];int cmp(int *r,int a,int b,int l){return r[a]==r[b] && r原创 2012-01-28 19:32:07 · 781 阅读 · 0 评论 -
【AC自动机详解+入门模板】HDU 2222
第一次写AC自动机,发现也不是太难理解,可能自己以前看过KMP&Trie而且理解的比较透彻吧,看自动机没有太大的困难,因为它也是利用了KMP的思想,理解了KMP,再看自动机就不难了:)转一下这个blog的描述先,感觉看起来比较好理解,可是他的代码就不敢恭维。。。http://www.cppblog.com/mythit/archive/2011/10/21/80633.html(有改动)补原创 2011-11-13 01:43:10 · 945 阅读 · 0 评论 -
【KMP】ZOJ 3587
利用了kmp的性质,kmp可以找出前i个在主串出现的次数(可覆盖),同样也可以找出后j个在主串出现的次数,只需要反向kmp就行了==,具体实现是两次预处理正向&反向,然后记录num1和num2数组所以复杂度是线性时间.....理解kmp是重点!#define N 100005char s[N],t[N];int next1[N],next2[N];int num1[N],num2原创 2012-03-13 00:55:38 · 1085 阅读 · 0 评论 -
【STL string中erase用法】
erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator position );(3)iterator erase ( iterator first, iterator last );也就是说有三种用法:(1)erase(pos,n); 删除从pos开始的n个字符,比原创 2012-03-03 21:11:39 · 6238 阅读 · 0 评论 -
【KMP模板】POJ 3461
kmp模板题,不懂可看Matrix67's blog 复杂度分摊为O(n)#define N 1000010char w[10005];//short stringchar t[1000005];//long stringint p[10005];//数组p[j],表示当匹配到B数组(主串)的第j个字母而第j+1个字母不能匹配了时,新的j最大是多少int sum;int原创 2011-11-11 11:14:08 · 488 阅读 · 0 评论 -
【字符串最小表示】HDU 2609
http://acm.hdu.edu.cn/showproblem.php?pid=2609对每个串都求出最小表示的串,sort一下,暴力一下。。。A了#define N 10005char str[N];struct node{ char s[1000];}ss[N];bool cmp(node a,node b){ return strcmp(a.s,b.s)<原创 2012-02-23 01:06:08 · 1403 阅读 · 0 评论 -
【字符串循环同构的最小表示法】
循环字符串的最小表示法的问题可以这样描述:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。由于语言能力有限,还是用实际例子来解释比较容易:设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最转载 2012-02-22 21:15:26 · 1277 阅读 · 0 评论 -
【KMP】HDU 3746
注意理解好p数组的含义!!!n - p[n]就是一个循环节的长度。x = n - p[n],x - (p[n] % x) = 形成两个循环节增加最小字符个数#include #include #include #include #include #include #include #include #include #include #include #include原创 2011-11-12 02:35:08 · 393 阅读 · 0 评论 -
【KMP应用】HDU 1711
简单的KMP,不解释。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace s原创 2011-11-12 01:35:41 · 329 阅读 · 0 评论 -
【KMP多串最长公共子串】POJ 3080
思路很简单,就是枚举第一个串求出每种情况是否在以后出现。用KMP进行匹配。可是就是一直wa!!!所以标记为unsolved2011-11-11 23:33:27更新:改了POJ 3450几个小地方就过了,真的真的很诡异! #include #include #include #include #include #include #include #inc原创 2011-11-11 21:35:12 · 673 阅读 · 0 评论 -
【trie树】hdu 2846
因为第一次接触字典树,所以参考了别人的代码,在这里要感谢http://hi.baidu.com/sulipol/blog/item/741f7c11c8bcfa0c203f2e4f.html该blog的博主,发表这么一篇通俗易懂的代码,让我明白字典树是怎么一回事!这题是给出n原创 2011-08-23 19:20:35 · 499 阅读 · 0 评论 -
【trie树】hdu 3724
妈的,一开始看下去以为跟hdu 2846一样,要处理子串。。。还傻b的用数组,结果MLE,本人最讨厌指针啥的,以为省功夫,谁知道就这样悲剧了!这就教训我有些事情不能省得,要做足!还有,刚开始纠结于那8个浮点数怎么处理,还来搜了一下,发现很简单:先找出8个中最小值minm,然后mi原创 2011-08-24 20:22:35 · 394 阅读 · 0 评论 -
数据结构之【trie树】
1、 概述Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。Trie树可以转载 2011-08-23 16:30:05 · 582 阅读 · 0 评论 -
【字符串暴力】hdu 2847
暴力不解释。#include #include #include #include #include #include #include #include #include #include #include #include #include #i原创 2011-08-22 21:34:50 · 803 阅读 · 0 评论 -
【回文串】ural 1297
回文串,原理:由一点向两边延伸,注意不要超出数组范围!听说可以用后缀数组,不懂,有空再研究研究#include #include #include #include #include #include #include #include #include #原创 2011-08-18 10:34:26 · 441 阅读 · 0 评论 -
AC自动机讲解
google了一篇好文章,猛击这里,留给以后有时间慢慢咀嚼原创 2011-07-29 02:43:59 · 540 阅读 · 0 评论 -
zoj 1905 字符串
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1905原创 2011-05-08 01:42:00 · 602 阅读 · 0 评论 -
zoj 1589 传递闭包
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=589Run IDSubmit TimeJudge StatusProblem IDLanguageRun Time(ms)Run Memory(KB) 25282682011-05-08 01:12:19Accepted 1589C0164简单闭包。。。注意一下用scanf来读入字符时getchar()使用就ok了#include#includeint re1[30][30],re原创 2011-05-08 01:13:00 · 608 阅读 · 0 评论 -
ZOJ Monthly, May 2011 - B Roman Order
<br />简单的字符串比较<br />#include<iostream>using namespace std;#include<string>#include<algorithm>struct node{ string s; int num;}a[10010];string f[4][9]={{"M","MM","MMM"},{"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},{"X","XX","XXX","XL","原创 2011-05-01 16:11:00 · 628 阅读 · 2 评论 -
【字符串RK匹配】POJ 1200
转换为nc进制!复杂度O(len)。#include #include #include #include #include #include #include using namespace std;#define N 16000005#define原创 2011-09-28 22:58:54 · 425 阅读 · 0 评论 -
The 2011 ACM-ICPC Asia Dalian Regional Contest——D Hexadecimal View
写得好挫,大牛们鄙视吧~#include #include #include #include #include #include #include #include #include #include #include #include #inclu原创 2011-10-02 22:58:48 · 833 阅读 · 0 评论 -
【KMP】POJ 2185
题目貌似有点难理解,忍不住看了一下解题报告。。。囧方法:对每行求最小重复长度,求出lcm,记为ans1;再对每列求最小重复长度,求出lcm,记为ans2ans1*ans2就是最后答案#include #include #include #include #include #include #include #include #include #include #in原创 2011-11-11 18:59:22 · 391 阅读 · 0 评论 -
【KMP】POJ 2406
求一个串中有多少重复字串?如ababab中结果为3,a = ab。方法:利用KMP的预处理得出数组p[i],很容易得出a长度为len - p[len]。#include #include #include #include #include #include #include #include #include #include #include #include原创 2011-11-11 13:38:34 · 415 阅读 · 0 评论 -
【最长回文子串——Manacher算法】POJ 3974/HDU 3068
转载:O(n)回文子串算法 这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法.原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/ 其实原文原创 2011-11-12 14:38:50 · 1003 阅读 · 0 评论 -
【KMP求多个串的最长公共子串】POJ 3450
奇怪,这题是POJ3080修改而ac的,在POJ3080却过不了,很诡异的说。。。难道哥的RP低成这样?!#include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2011-11-11 23:28:10 · 749 阅读 · 0 评论 -
【KMP】POJ 1961
这题跟POJ 2752差不多,因为要求前缀,所以要从前到后遍历求出每个满足要求的前缀。#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2011-11-11 17:52:38 · 338 阅读 · 0 评论