摘要:
*算法介绍:扩展KMP算法是对KMP算法的一种扩展,对于求两个字符串的公共部分非常有效。题目可以有多种变化。最普通的的是给定母串text与子串part。求数组extend[i],extend[i]表示text[i...n]字符串与part最长前缀的长度。*思路:1.主代码:与KMP的思路一致,我们设next数组表示:next[i...n]与next数组本身的最长公共前缀长度。假设我们现在已经知道extend[0....i]的值,接下来要求extend[i+1]的值。设1=k+extend[k] 我们目前只能确定(1)中的L个字符匹配,接下来不能确定,所以需要挨个比较,并且比较完后需令:k=i+ 阅读全文
摘要:
*题意: 给一定数量的基因片段,将这些片段可并成一条片段,输出最短片段的长度。*思路: 将不同片段两两组合,求出最短长度存在addlen[i][j]中,然后用dfs遍历addlen[i][j](即把所有片段组合成一串)保存最短片段的长度,最后输出。实际上就是枚举各种情况,当然在串成一串的过程中若发现长度已经比先前存的最短长度要长就可以舍弃,直接进入下一种情况#include#include#includeusing namespace std;char gene[11][111];int addlen[11][11],len[11],sign[11];int n,t,ans;void ad.. 阅读全文
摘要:
*介绍: KMP算法是在给定的一串字符串中查找是否有目标串。*分析:1、一般解法 对于以上问题,假如用朴素算法,我们容易想到:用目标串(长度为n)的第1个字符依次与给定串(长度为m)的第1个至最后一个字符对齐匹配,直到找到目标串为止。这样算法复杂度是m*n。2、KMP算法:思路分析: KMP算法通过建立一个数组(一般命名为next)来记录目标串的自身特征从而简化匹配过程,令算法的复杂度降至m+n。 举例,假设目标串为: a b c a b c d d e a 对应next数组的值为: 0 0 0 1 2 3 0 0 0 1 通过观察我们会发现next数组记录的是以当前字... 阅读全文
摘要:
*题意: 在1到n之间添加‘+’,‘-’,‘.’三种运算符令最后结果为0,输出前20种添加方法,若不足20种则全 输出,最后输出共有多少种添加方式。(‘.’表示将其两侧的数连成一个数例:1.2.3是123)*思路:dfs,枚举各种情况,找出合适的。*代码:#include#includeusing namespace std;char symbol[16];int num,n;void print(){ int i; for(i=1;i printf("%d %c ",i,symbol[i]); printf("%d\n",i);}void dfs(i. 阅读全文
摘要:
*题意: 相当于在一个数轴上给定农夫的位置n与牛的位置k。假定牛不懂,农夫每次有三种移动方式:n+1.n-1.n*2。问农夫最少移动几步后才能到牛的位置。*思路: 用bfs寻找最短路径。*代码:#include#include#includeint queue[100001];bool visit[100001];int step[100001];using namespace std;void bfs(int n,int k){ memset(visit,0,sizeof(visit)); memset(step,0,sizeof(step)); int i,next,... 阅读全文
摘要:
*题意: 将1-20摆成一个环,要求相邻两数相加是素数。*思路: 回溯*代码:#includeusing namespace std;int a[21];int check1(int c,int b){ for(int i=1;i<=b-1;i++) if(a[i]==c)return 0; return 1;}int check2(int x){ int k; for(k=2;k if(x%k==0)return 0; return 1;}int check3(int j,int i){ if(i<20)return (check2... 阅读全文
摘要:
一、sort:1、头文件#include2、格式 sort(arry,arry + n,cmp) 说明:arry为数组名(即首元素地址)、n为数组中元素个数、cmp是自己定义的函数。因为sort默认升序排序,通过自己定义的cmp我们可以实现降序、二位排序等操作。3、应用:a、字符数组char:#include#includeusing namespace std;int main(){ char a[11]={'b','a','v','r','f','d','j','t 阅读全文
摘要:
描述 Description“低买高卖”是在神牛证券市场上成功的秘诀的一半。作为一个好的投资者,你必须还遵守下面这条建议:“逢低吸纳,越低越买”每次你购买股票的时候,你必须以比上次购买这只股票的价格更低的价格来购买这只股票。购买比上次便宜的股票的次数越多越好!你的目标是计算像这样的低价进仓最多可以进行多少次。数据会给你一只股票在一段时期内每日的交易价格(16位正整数)。你可以选择在任何一天购买股票。每次你选择购买股票的时候,股价必须严格小于你上次购买股票的股价。写一个程序来确定在那些日子购买股票来最大化你购买的次数。下面是一张股价表:日期 12345678910 11 12价格 68 69 5 阅读全文
摘要:
*题意:用最少的雷达覆盖所有岛屿*思路:贪心,具体点就是把每个岛屿可以被雷达侦测的区间求出来,然后按照区间左边升序排序,区间的重合部分仅需一个雷达并且此雷达放在重合区间的最右侧(此处体现贪心)以尽可能侦测更多岛屿。*注意:尽可能减少运行时间,在poj上63ms就可以ac,不过同样的代码在杭电就过不去。代码:#include#include#include#includestruct position { double x; double y; };int cmp(const void* a, const void *b){ return ((pos... 阅读全文
摘要:
*题意:(此题是题意难懂的水题,只要搞懂题意其他不成问题)MS Inc公司每个月盈利一定盈利s,亏空一定亏空d。它每连续的5个月统计一次分别是1-5月、2-6月、3-7月.....直到8-12月,这样一年共统计8次并且这8次的结果都是亏空。现在给你一组s,d(每个月的亏空与盈利)判断这个公司是否能盈利,若能输出最大盈利,否则输出“Deficit”。*思路:贪心,在保证8次结果都是亏空的条件下让亏空月份最少,基于这种分析可得以下5种情况。i表示每次统计中最少亏空的月数,s表示盈利,d表示亏空,s与d组成的字符串表示在这种情况下全年最大盈利。1、i=1:SSSSDSSSSDSS2、i=2:SSSD 阅读全文