数据结构
南山小翁
活在当下,要有思想,每个人不是随随便便就能成功!
展开
-
新的开始
Problem DescriptionGiven two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b原创 2012-12-31 23:49:03 · 393 阅读 · 0 评论 -
poj3261 (二分+后缀数组)可重叠的至少为k次最长重复字串
#include#include#define max 1000100int rank[max],wa[max],wb[max],wv[max],wn[max];int height[max],sa[max],r[max];int N,K;int cmp(int* r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l];原创 2013-01-30 09:44:35 · 536 阅读 · 0 评论 -
poj3080 (二分+后缀数组)简单题
求最长的公共字串。#include#include#define max 610int next[max],sa[max];int wa[max],wb[max],wv[max],ws[max];int rank[max],height[max];int vis[max];char tem[max];int str[max],lcp[max],n;char ans[max];i原创 2013-01-30 16:36:15 · 539 阅读 · 0 评论 -
ac自动机 病毒侵袭持续中
病毒侵袭持续中Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 1 Accepted Submission(s) : 1Problem Description小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵原创 2013-01-31 18:57:40 · 722 阅读 · 0 评论 -
ac自动机
Count the stringTime Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 9 Accepted Submission(s) : 4 Problem Description It is well known th原创 2013-01-19 18:40:12 · 424 阅读 · 0 评论 -
hdu 3336 KMP走起 如果让我说:我只能说,实力决定一切
思路:利用KMP求解串的前缀的个数:例如: a b a b next: -1 0 0 1 含义:当前字原创 2013-04-25 12:37:40 · 644 阅读 · 0 评论 -
hdu3746 KMP之next[]威武 如果让我说:我只能说,实力决定一切。
本人感觉本题和hdu3336这个题很好,完全考察KMP中next[]的性质:hdu3336这个题可以做做 思路:求解最小循环节,如果题目存在最小循环节,那么输出0,否则输出你最小还应该添加多少个才满足最小循环节特征。利用KMP的性质:①aaa,next[3]=2 最小循环节为1即:Len-2=1,满足最小循环节的要求,不需要添加数了。②abca next[4]=1 最小循环节为Len原创 2013-04-25 15:55:00 · 590 阅读 · 0 评论 -
hdu2087 这道题 好给力! memset()伤不起 如果让我说:我只能说,实力决定一切。
如果你对KMP中,next【】的性质足够了解的话, 瞬秒#include#include#include#includeusing namespace std;char mat[200];char pat[200];int next[200];void get_next(char *tem){ int k=-1; int j=0;原创 2013-04-25 16:58:42 · 605 阅读 · 0 评论 -
hdu2594 今早1A 题目不错=~~= 如果让我说,我只能说,实力决定一切
思路:建议一下,如果你在学KMP或者AC自动机,如果你弄懂其原理,变形 so easy! 注意对pat求完next[]值后,在匹配时,注意是到mat的结尾,即:while(j #include#include#include#includeusing namespace std;char mat[50010];char pat[50010];int n原创 2013-04-26 07:38:24 · 527 阅读 · 0 评论 -
poj2185 KMP+欧几里得 求最小的覆盖
题意:给一个n*m的大小的矩形,里面存一些字母,让你找出最小的串能够覆盖这个矩形。例如:aaaa 能让一个a完全覆盖。ababaababa能让ab覆盖。思路: 我们先求解每行的最小覆盖C,然后再求每列的覆盖R,然后最小的覆盖就是C*R。 #include#includechar str[10005][80];int next[10005];int原创 2013-04-26 11:13:21 · 542 阅读 · 0 评论 -
poj 2752 KMP+DFS() 如果让我说:我只能说,实力决定一切
思路:利用KMP的性质,求解:即是前缀又是后缀的字符串的长度。如果存在一个最长的前缀和后缀相等,那么次小的一定存在这个最长的里面,然后利用DFS()输出即可。#include#include#include#includeusing namespace std;int next[400100];char cha[400100];void get_next(char *tem){原创 2013-04-26 19:40:02 · 494 阅读 · 0 评论 -
poj3974 hdu3068最长回文子串 如果让我说:我只能说,实力决定一切
思路:简单题目,利用Manacher()方法,解决问题的方法和KMP类是,避免了冗余操作,可以提高效率poj3974: #include#include#include#includeusing namespace std;char pat[1000100*2];char tem[1000100];int sum[1000100*2];int pox;原创 2013-04-27 10:36:32 · 529 阅读 · 0 评论 -
poj3461 找子串出现的个数
#include#include#define max 1000010char W[10010];char T[max];int next[10010];void get_next(char tem[]){ int j=0,k=-1; int len=strlen(tem); next[0]=-1; while(j<len) {原创 2013-01-29 15:39:47 · 609 阅读 · 0 评论 -
poj2158 利用next[]的性质求解
题意:求最小的覆盖=最小的行覆盖X最小的列覆盖#include#includechar str[10005][80];int next[10005];int n,m;int gcd(int x,int y){ return y>0?gcd(y,x%y):x;}int get_next(char tem[]){ int j=0,k=-1; int len原创 2013-01-28 16:32:14 · 669 阅读 · 0 评论 -
hdu1403 简单的后缀数组
题意:判断给定的两个串中,最长的公共串。思路:将它们合并为一个串,然后利用后缀数组求解。#include#include#define max 1000010int wa[max],wb[max],wv[max],ws[max];int rank[max],height[max];int sa[max];char str[max*2];int cmp(int *r,int a,i原创 2013-01-25 16:25:00 · 1048 阅读 · 0 评论 -
poj2955 后缀数组
题意:判断给定的两个串中,最长的公共串。 思路:将它们合并为一个串,然后利用后缀数组求解。#include#include#define max 1000010int wa[max],wb[max],wv[max],ws[max];char str[max*2];int sa[max];int cmp(int *r,int a,int b,int l){ retur原创 2013-01-26 13:09:50 · 895 阅读 · 1 评论 -
hdu3518 后缀数组
题意:找出一个字符串中至少重复出现两次的字串的个数,注意重复出现时不能有重叠的现象思路:利用height[ ]性质解决。//height[i]=suffic(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是//排名相邻的两个后缀的最长公共前缀。//suffix(j)和suffix(k)的最长公共前缀为height[rank[j]+1],height[rank[j]+2],原创 2013-01-25 20:06:15 · 1983 阅读 · 0 评论 -
hdu1876 KMP
题意:给你两个字符串,输出他们合并之后的最小长度的字符串 思路:1.长度小的优先 2.#include#include#define max 100010int next[max];char st1[max],st2[max];void getNext(char *pat){ int j=0,k=-1; int len=strlen(pat); next[0原创 2013-01-11 20:10:33 · 638 阅读 · 1 评论 -
AC自动机详解
首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。如果你对转载 2013-01-13 10:51:44 · 396 阅读 · 0 评论 -
hdu2222 简单的AC自动机
利用trie树和KMP算法:就是在 Trie 上进行 KMP 匹配。题意:给你n个单词和一条字符串,问你在这个字符串中,包含几个单词。思路:这是一条多串匹配的题目,AC自动机//#include#include#include#include#includeusing namespace std;struct node{ int count;/原创 2013-01-13 10:59:58 · 417 阅读 · 0 评论 -
多串匹配 AC自动机
AC自动机即 Aho-Corasick automation,该算法在1975年产生于贝尔实验室。AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文章,让你在文章中找这些串是否出现过,在哪出现。AC自动机思想简单来讲就是在 Trie 上进行 KMP 匹配,所以先要知道 Trie数据结构 和 KMP算法。AC自动机先将所有模式串构建成单词树,如有模式串 { she转载 2013-01-13 10:54:21 · 590 阅读 · 0 评论 -
poj2406
感悟:学习算法,不仅要学会其本身,自己还应该能扩展,要务实,不要急功近利。否则,会学的一塌糊涂。要求:求最小重复字串的个数,利用KMP算法的性质,求解。 #include#include#define max 1000000int next[max];char str1[max];int get_next(char *pat){ int j=0,原创 2013-01-28 11:26:24 · 2684 阅读 · 0 评论 -
poj2752 kmp 进一步运用
/*题意:给定字符串,判断哪些下标开始即是它的前缀又是它的后缀同时,由kMP中next[]的性质可得,模式串的前半部分的字符和后半部分的字符相同。*/#include#include#define max 400010int next[max];char str[max];void get_next(char tem[]){ int j=0,k=-1; int原创 2013-01-28 19:22:39 · 424 阅读 · 0 评论 -
hdu2896 AC自动机
#include#include#include#include#include#define kind 94using namespace std;struct node{ int pox; struct node *fail; struct node *next[kind]; node() { pox=0;原创 2013-01-13 13:28:17 · 699 阅读 · 0 评论 -
poj3294 二分+后缀数组
//题意:给定n个字符串,让你求出在大于n/2个字符串中的最长公共串。//height数组,存的是排名相邻的两个后缀的最长公共前缀。height是按后缀的字典序来的//rank保存的是suffix(i)在所有后缀中从小到大的排列的名次。//后缀数组sa:将str的n个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入SA中。#include#include#define max原创 2013-01-29 13:55:01 · 378 阅读 · 0 评论 -
uva10391 单词复合 利用二分查找求解
#include#include#include#includeusing namespace std;const int Max=120010;char word[Max][100];int search(char *str,int n){ int left=0,right=n-1; while(left<=right) {原创 2013-05-23 12:06:07 · 1685 阅读 · 1 评论