摘要: height数组:定义 height[i] = suffix[i-1] 和 suffix[i] 的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀。那么对于 j 和 k 不妨设 Rank[j] =h[i-1]-1. 证明: 设suffix[k]是排在suffix[i-1]前一名的后缀,则它们的最长公共前缀是h[i-1]。那么suffix[k+1]将排在suffix[i]前面(这里要求h[i-1]>1,如果h[i-1]<=1原式显然成立)并且suffix[k+1]和suffix[i]的最长公共前缀是h[i-1]-1,所以suffix(i)和它前一位的最长公共前缀至少是h[i-1] 阅读全文
posted @ 2013-08-05 21:01 yongren1zu 阅读(743) 评论(0) 推荐(0) 编辑
摘要: 暴力求解题意:求一个公共子串的最大长度,反转的公共子串存在也算。求解思路:先找出最短的字符串进行暴力枚举。每截取一个子串后,求出它的反转字符串,然后检验这两个子字符串是否存在输入的字符串组中,每个字符串只要存在子字符串和的翻转串其中一个就行。#include#include#includeusing namespace std;#define max(a,b) a>b?a:bint n,len,id;string str[110];bool check(string sub){ string tmp; int sl=sub.size(); for(int i=0;i=i;j-... 阅读全文
posted @ 2013-08-05 14:37 yongren1zu 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 今天看了一下后缀数组算法,感觉好NB的样子,的确不太好看~~,可能智商捉急吧~~ 后缀是字符串 r 从第 i 个字符开始到字符串结尾,后缀表示为 suffix(i)。 后缀数组:sa是一个一位数组,保存1...n的某个排列sa[1],sa[2],...,sa[n],并且保证后缀从小到大进行排序之后把排序好的后缀的开头位置依次放入sa中。 名次数组:名次数组Rank[i]保存的是suffix[i]在所有后缀中从小到大排列中的名次。 后缀数组-------排第几的是谁,名次数组------你排第几。 倍增算法:对每个字符开始的长度为2^k的子字符串进行排序,求出排名。k从0开始,每次... 阅读全文
posted @ 2013-08-04 16:54 yongren1zu 阅读(682) 评论(0) 推荐(0) 编辑
摘要: 找一个字符串的最小字典排序,最小表示法返回最小字典排序首字母的下标。最小表示法的复杂度为O(n)。实现方法:(1).利用两个指针p1,p2。初始化时p1指向s[0],p2指向s[1]。(2).k=0开始,检验s[p1+k]和s[p2+k]是否相等,相等则k++,一直下去,直到找到第一个不相同的字符(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。该过程中s[p1+k]和s[p2+k]的关系有三种: 1).s[p1+k]>s[p2+k],p1滑动到p1+k+1处,s[p1--p1+k-1]不会是循环字符串的"最小表示"的前缀。 2). 阅读全文
posted @ 2013-08-03 23:18 yongren1zu 阅读(218) 评论(0) 推荐(0) 编辑
摘要: Manacher算法用于求回文子串,它的复杂度为O(n)。这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。在相邻的两个字符之间加进一个分隔符 '#' ,串的首尾也要加。原串:abaab新串:#a#b#a#a#b#中心思想是,用一个辅助数组p记录以每个字符为中心的最长回文半径,也就是p[i]记录以s[i]字符为中心的最长回文半径。p[i]最小为1,此时回文串为s[i]本身。我们用MaxId记录在 i 之前的回文串中,延伸至最右端的位置,同时用id记录这个MaxId的id值。核心代码如下: for(i=1;ii) { ... 阅读全文
posted @ 2013-08-03 15:46 yongren1zu 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 参考博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP算法用来匹配两个字符串,即b串是否为a的子串。 普通算法的复杂度为O(n*m),KMP算法的复杂度为O(n+m)。 用 i 计数 a 串的位置,用 j 计数 b 串的位置。 普通算法: 如果 a[i] != b[j] ,则 i 回溯,j=0。 KMP算法: KMP算法和普通算法的区别在于,KMP消除的 i 的回溯,只需确定下次匹配 j 的位置即可。在KMP算法中引入了next数组,为了确定匹配不成功时,下次匹配时 j 的位置。n... 阅读全文
posted @ 2013-08-03 15:17 yongren1zu 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 这道题又无耻的抄袭了别人的代码。刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集。最大独立集=|G|-最大匹配。首先先把性别分开,因为同性不能成为couple,然后把符合条件的异性连一起,然后就是最大匹配了。#include#include#define maxn 505#define maxl 106struct Person{ int h; char music[maxl]; char sport[maxl];} male[maxn], female[maxn];int uN,... 阅读全文
posted @ 2013-08-02 15:46 yongren1zu 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题意:Alice和Bob每次翻一个矩形区域的硬币,直到所有硬币都为负面时轮到的那个人输。由于每次都会翻右下角的硬币,如果右下角的硬币为正,那么结束时翻硬币的次数一定是奇数,那么Alice赢,如果右下角硬币为反,则Bob赢。#includeint main(){ int n,m; int T,a; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { ... 阅读全文
posted @ 2013-08-01 21:58 yongren1zu 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 一道dp题,转移方程不是自己推出来的。题目的意思是用‘qnmlgb’替换‘hehe’,可以替换也可以不替换,问有多少种情况。如果结尾不是‘hehe’,那么dp[i]=dp[i-1],如果是是‘hehe’,dp[i]=dp[i]+dp[i-4],因为最后一个可以换也可以不换,如果进行替换则是dp[i-4]。#include#include#define M 10007char s[10100];int dp[10100]={1};int main(){ int T,cas=1; scanf("%d",&T); while(T--) { scanf("%s&q 阅读全文
posted @ 2013-08-01 20:41 yongren1zu 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分#include#include#define N 505int match[N],visit[N];int n,m;int g[N][N];int DFS(int u){ int i; for(i=1;i<=n;i++) if(!visit[i]&&g[u][i]) { visit[i]=1; if(match[i]==-1||DFS(match[i])) { ... 阅读全文
posted @ 2013-08-01 15:25 yongren1zu 阅读(168) 评论(0) 推荐(0) 编辑