摘要: 题意:给出两个字符串,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 小猴子、 阅读(288) 评论(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 小猴子、 阅读(285) 评论(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 小猴子、 阅读(462) 评论(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 小猴子、 阅读(222) 评论(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 小猴子、 阅读(289) 评论(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 小猴子、 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 大致题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。解题思路:可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次。这样就是求图中是否存在欧拉路Euler-Path。由图论知识可以知道,无向图存在欧拉路的充要条件为:①图是连通的;②所有节点的度为偶数,或者有且只有两个度为奇数的节点。View Code #include<stdio.h>#include<string.h> 阅读全文
posted @ 2012-08-04 02:42 小猴子、 阅读(258) 评论(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 小猴子、 阅读(268) 评论(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 小猴子、 阅读(237) 评论(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 小猴子、 阅读(271) 评论(0) 推荐(0) 编辑