摘要: http://acm.hdu.edu.cn/showproblem.php?pid=4300题意:题目大意是有一份文件,前面是密文,后面是原文,但那个人接到这个文件后不知道中间从哪里开始是原文,所以你要帮忙还原一下,如果后面原文比密文少,你就将它补全。思路:将它给出的明文加密文全部转换一次,将转换了的做模式串,与原串进行kmp,记录返回的j值,j值代表的就是前缀和后缀的最长相等长度。当然,在比较时要注意,密文长度肯定要>=明文长度,所以在匹配的时候,要保证前面比后面长,以免出现错误。#include<iostream>#include<string.h>using 阅读全文
posted @ 2013-01-03 15:43 紫忆 阅读(1027) 评论(0) 推荐(0) 编辑
摘要: 题意:FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x。另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[j]),沟通起来消耗的能量为:max(v[i],v[j]) * 它们之间的距离。问要使所有的牛之间都能沟通(两两之间),总共需要消耗多少能量。思路:此题和hdu3015(我前面写的,有详细解答)一种类型的,传送门:http://www.cnblogs.com/ziyi--caolu/archive/2012/12/30/2839892.html#include<iostream>#inclu 阅读全文
posted @ 2013-01-02 21:31 紫忆 阅读(470) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1358#include<iostream>#include<string.h>using namespace std;#define M 1000005int next[M];char s[M];void getnext(){ int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; }}int 阅读全文
posted @ 2013-01-02 19:38 紫忆 阅读(214) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3746#include<iostream>#include<string.h>using namespace std;int next[200000];char s[200000];void getnext(){ int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; }}int main() 阅读全文
posted @ 2013-01-02 18:47 紫忆 阅读(196) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=10758思路:KMP,next表示模式串如果第i位(设str[0]为第0位)与文本串第j位不匹配则要回到第next[i]位继续与文本串第j位匹配。则模式串第1位到next[n]与模式串第n-next[n]位到n位是匹配的。所以思路和上面一样,如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。例如:a b a b a bnext:-1 0 0 1 2 3 4next[n]==4,代表着,前缀abab与后缀abab相等的最长长度,这说明 阅读全文
posted @ 2013-01-01 21:03 紫忆 阅读(4639) 评论(1) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2594方法一:思路:这题是有两个字符串,要第一个字符串的最长前缀等于第二个字符串的最长后缀。这样,根据kmp中next的特性,可以将第一个字符串当作模式串(因为要求它的最长前缀),第二个字符串当作主串,对两者进行kmp匹配。这样,当主串的i不断往后,而j要是都不匹配的话,会在-1和0之间往复,当i到了主串后面,开始和模式串匹配时,就可以根据next函数的特性来判断出前缀与后缀相等的最长长度。#include<iostream>#include<string.h>using namesp 阅读全文
posted @ 2013-01-01 17:05 紫忆 阅读(307) 评论(0) 推荐(0) 编辑
摘要: KMP算法在介绍KMP算法之前,先介绍一下BF算法。一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P:ababaBF算法匹配的步骤如下 i=0 i=1 i=2 i=3 i=4 第一趟:ababcababa 第二趟:ababcababa 第三趟:ababcababa 第四趟:ababcababa 第五趟:ababcababa ababa abab... 阅读全文
posted @ 2013-01-01 16:28 紫忆 阅读(3893) 评论(0) 推荐(1) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1686#include<iostream>using namespace std;int next[10005];char s[10005],t[1000006];void getnext(char s[]){ int i=0,j=-1; next[0]=-1; int len=strlen(s); while(i<len) if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } e... 阅读全文
posted @ 2012-12-31 15:13 紫忆 阅读(292) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3015题意:对于n棵树,给出所在位置和高度,然后分别对它的位置和高度做如下处理:位置:将位置升序排序,最小的定义等级为 1,次小的定义等级为2,但是,要是位置相同的,则等级定义要相同;例如:位置 1,2,1,5,2,3 等级 1,3,1,6,3,5对于高度也是做如上处理;然后,定义f=两树之间的距离差的绝对值,s=两树中最小的高度,求所有树之间f*s和。思路:先对输入的数据进行处理,定义好等级,之后,发现对s进行升序排序后,再对f来处理会比较好做。如果排完序后,用暴力做,肯定超时。再想想,处理一个数据前面或者 阅读全文
posted @ 2012-12-30 18:17 紫忆 阅读(708) 评论(0) 推荐(0) 编辑
摘要: http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=13384题意:给一个n*m的矩阵,里面有些小矩阵有树,再给一个范围,要你求在它所给定的范围内,最多可以有多少颗树?思路:二维树状数组..........反思:一开始,我是对于矩阵给出的范围直接处理的,结果错了.........#include<iostream>using namespace std;int s[105][105],c[105][105];int lowbit(int x){ return x&(-x);}void updata( 阅读全文
posted @ 2012-12-29 20:34 紫忆 阅读(218) 评论(0) 推荐(0) 编辑