随笔分类 -  数据结构

摘要:题目链接http://poj.org/problem?id=2406大致题意:题目要我们求出一个字符串得最大循环长度!做过了poj1961这个题就一点问题都没有了要知道next数组的含义和 if(i % (i-j) == 0 && i / (i-j) > 1)的含义,我在上篇解题报告上贴了,也就是poj 1961中。直接贴代码吧#include<stdio.h>#include<string.h>char str[1000002];int next[1000002];int main(){ while(scanf("%s", s 阅读全文
posted @ 2012-11-02 12:36 小猴子、 阅读(295) 评论(0) 推荐(0)
摘要:题目链接 http://poj.org/problem?id=1961大致题意:给出一个串,输出第i位之前的串是由多少个相同的子串组成的。输出i的子串的个数。思路:在next数组中加一句判断即可if(i%(i-j) == 0 && i/(i-j) > 1) { printf("%d %d\n", i, i/(i-j));}这条语句是什么意思?要了解next数组的求法,那么就不难理解了。对于 i%(i-j) == 0遍历到第i个字符,前面字符串的长度为i,且前面字符串的前缀和后缀相等的字符的个数是j个。如果想要得到像题意那样的序列,则j必满足j》=i/2 阅读全文
posted @ 2012-11-01 20:19 小猴子、 阅读(362) 评论(0) 推荐(0)
摘要:转载:http://blog.csdn.net/guo_love_peng/article/details/6618170 int get_nextval(SString T,int &nextval[ ]){ //求模式串T的next函数修正值并存入数组nextval。 i=1; nextval[1]=0; j=0; while(i<T[0]){ if(j==0||T[i]==T[j]){ ++i;++j; if (T[i]!=T[j]) nextval[i]=j; else nextval[i]=nextval[j]; } else j... 阅读全文
posted @ 2012-10-31 00:44 小猴子、 阅读(459) 评论(0) 推荐(0)
摘要:题意:给出两个字符串,a和b,在b中删除a串,删除多少次不能在删除了。#include<stdio.h>#include<string.h>char b[520000],a[2000],st[520000];int main(){ while(scanf("%s %s", a, b) != EOF) { int ans = 0; int tp = 1; int len = strlen(a); for(int i = 0; b[i]; i++) { st[tp-1] = b[i]; if(tp >= len) { st[tp] = 0; if( 阅读全文
posted @ 2012-08-26 22:37 小猴子、 阅读(306) 评论(0) 推荐(0)
摘要:题意:可重叠的k次最长重复子串。思路:后缀数组。先二分答案,然后将后缀分成若干组。这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k个相同的子串满足条件,否则不存在。时间复杂度为O(nlogn)。/* 后缀数组倍增算法 * 并且计算了height[], height[i] = LCP(i-1, i), LCP(i, j)=lcp(suffix(sa[i]), suffix(sa[j])) * 时间复杂度:N*logN * */#include <cstdio>#include <cstring>#include <algorithm>using 阅读全文
posted @ 2012-08-20 22:36 小猴子、 阅读(302) 评论(0) 推荐(0)
摘要:View Code #include<stdio.h>const int MAXN = 100000 + 10;class Node { int s; //值。 int i; //下标。public: Node() {} Node(int i, int s) : i(i), s(s) {} ~Node() {} int visi() {return this->i;} int viss() {return this->s;}}que[MAXN];int s[MAXN];int main(){ int n, m; while(scanf("%... 阅读全文
posted @ 2012-08-10 02:17 小猴子、 阅读(482) 评论(0) 推荐(0)
摘要:大致题意: 给出一个字符串,求出所有不重叠出现次数大于等于两次的子串的数目。View Code /* 后缀数组倍增算法 * 并且计算了height[], height[i] = LCP(i-1, i), LCP(i, j)=lcp(suffix(sa[i]), suffix(sa[j])) * 时间复杂度:N*logN * *///hdoj 3518.#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXM = 10000 + 10;co 阅读全文
posted @ 2012-08-08 18:00 小猴子、 阅读(239) 评论(0) 推荐(0)
摘要:题意就是求多个串的最长公共子串,把多个串合并成一个串,中间用没有出现过的字符隔开,然后对这个串求后缀数组,然后二分枚举答案。View Code /* 后缀数组倍增算法 * 并且计算了height[], height[i] = LCP(i-1, i), LCP(i, j)=lcp(suffix(sa[i]), suffix(sa[j])) * 时间复杂度:N*logN * *///poj 3450.#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const i 阅读全文
posted @ 2012-08-06 16:37 小猴子、 阅读(307) 评论(0) 推荐(0)
摘要:题意:给出两个串,求最长公共子串的长度。分析:将两个串合并成一个串,中间用一个没有出现过的字符连接,然后求新的串的后缀。View Code /* 后缀数组倍增算法 * 并且计算了height[], height[i] = LCP(i-1, i), LCP(i, j)=lcp(suffix(sa[i]), suffix(sa[j])) * 时间复杂度:N*logN * *///poj 2774.#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int 阅读全文
posted @ 2012-08-05 19:52 小猴子、 阅读(340) 评论(0) 推荐(0)
摘要:大致题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。解题思路:可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次。这样就是求图中是否存在欧拉路Euler-Path。由图论知识可以知道,无向图存在欧拉路的充要条件为:①图是连通的;②所有节点的度为偶数,或者有且只有两个度为奇数的节点。View Code #include<stdio.h>#include<string.h> 阅读全文
posted @ 2012-08-04 02:42 小猴子、 阅读(277) 评论(0) 推荐(0)
摘要:题目大意:给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。这个题数据量大,虽然给7s的时间,但是冒泡的话肯定超时。这个题让你求的是逆序数,我们用归并排序来求。一个乱序序列的逆序数=在只允许相邻两个元素交换的条件下,得到有序序列的交换次在做这道题前,我参考了《大话数据结构》 编著:程杰 P406, 《c/c++函数与算法速查手册》 编著:陈锐 P582.View Code #include<stdio.h>#include<limits.h>const int MAXN = 500000 + 10;const int INF = I 阅读全文
posted @ 2012-08-03 22:01 小猴子、 阅读(287) 评论(0) 推荐(0)
摘要:水题一道View Code #include<stdio.h>#include<string.h>char a[100001],b[100001];int main(){ while(scanf("%s %s", a, b) != EOF) { char *ta = a; char *tb = b; while(*tb) { if(*ta == *tb) { ta++, tb++; } else { tb++; } ... 阅读全文
posted @ 2012-08-02 02:10 小猴子、 阅读(259) 评论(0) 推荐(0)
摘要:大致题意:就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10规定:1、最长公共串长度小于3不输出2、若出现等长的最长的子串,则输出字典序最小的串解体思路: 暴力。View Code #include<stdio.h>#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;vector<string> vec;int main(){ int n; while(scanf(&quo 阅读全文
posted @ 2012-08-01 23:55 小猴子、 阅读(287) 评论(0) 推荐(0)
摘要:大致题意:输入一部字典,输入若干单词1、若某个单词能在字典中找到,则输出corret2、若某个单词能通过变换或删除或添加一个字符后,在字典中找得到,则输出这些单词,输出顺序根据输入的那部字典的字典序3、若某个单词无论操作与否都无法在字典中找得到,则输出空View Code #include<stdio.h>#include<string>#include<vector>#include<iostream>using namespace std;vector<string> vec;bool is_equal(string a, str 阅读全文
posted @ 2012-08-01 21:33 小猴子、 阅读(318) 评论(0) 推荐(0)
摘要:大致题意:有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度给定各个要求的小木板的长度,及小木板的个数n,求最小费用以3 8 5 8为例,一共3个木板,长为8 5 8,先取5 8,为13,在取8 13,为21,两次取的和为34.STL优先队列:Memory: 1000KTime: 32MSLanguage: G++Result: AcceptedView Code #include<stdio.h>#include<queue>using namespace std;#define llong long longp 阅读全文
posted @ 2012-07-31 14:49 小猴子、 阅读(342) 评论(0) 推荐(0)
摘要:题目大意:给你一个数字串,最大长度80,然后计算里面每个数字出现的次数,按照从小到大的顺序排列成另一个数字串。比如5553141变化后是2113 14 35(2个1,1个3,1个4,3个5)。如果1次变化后,数字串没变,那么输出“n is self-inventorying”其中,n代表题目给你的那个字符串。比如31123314 按照规则变化后还是31123314,所以输出“31123314 is self-inventorying ”。如果 J次变化后,字符串变成了一个self-inventorying 那么输出“n is self-inventorying after j steps”其中 阅读全文
posted @ 2012-07-30 23:17 小猴子、 阅读(498) 评论(0) 推荐(0)