08 2015 档案
摘要:最大子矩阵和最大连续子序列十分类似。 对于矩阵,可以将他的一列相加,然后成为一行,就是最大连续子序列了。
阅读全文
摘要:想了好久,决定还是写一篇随笔来总结我的大一总结吧。 大一刚开学,恍惚。不知道干啥,浑浑噩噩了2个月左右,我接触到了acm,开始我也不知道是干嘛的,只听学长们说是学算法,虽然还是没怎么懂。 当时c语言看的差不多学完了,也不知道能干吗。后来学长们推荐了杭电oj,来了题a+b,然后又来了几发a+b。也不知
阅读全文
摘要:一个分数假如 3/5=1/(1+2/3)=1/(1+1/(1+1/2)); 当分子出现1的时候,只要让分母减一。
阅读全文
摘要:#include #include #define maxn 100 char name[maxn]; char s[30]; int main() { int i,j,t,n,ff=0,flag; int y1,y2,y3,y4;//无错 有错 全错 缺席 scanf("%d",&t); while(t--) { scanf("%d...
阅读全文
摘要:#include #include #include using namespace std; #define maxn 1000 int a[maxn]; int main() { int i,j,t,n,ff=0; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;imax...
阅读全文
摘要:这题开始的思路:用二维数组来存,果断超时了,因为数组开不了。 后来看了别人的题解,使用一维数组来存。
阅读全文
摘要:#include #include #define maxn 105 int a[maxn],dp[maxn],map[maxn][maxn],pre[maxn]; int max(int x,int y) { return x>y?x:y; } void print(int p) { if(p==1)//一定从1点出发 { printf("1"); ...
阅读全文
摘要:用dp[i][j]表示放了i件物品,j对时的最小值。 dp[i-2][j-1]表示取当前的 dp[i-1][j]表示不取当前的。
阅读全文
摘要:标记数组用bool型防止超时。输入的f[ ]要排序。
阅读全文
摘要:http://www.cnitblog.com/weiweibbs/articles/42735.html 上一期的文章里我们仔细研究了Nim游戏,并且了解了找出必胜策略的方法。但如果把Nim的规则略加改变,你还能很快找出必胜策略吗?比如说:有n堆石子,每次可以从第1堆石子里取1颗、2颗或3颗,可以
阅读全文
摘要:找规律,发现时斐波那契数列;打表上。#include#include#define maxn 2147483647__int64 vis[100];int count;void init(){ memset(vis,0,sizeof(vis)); __int64 l1,l2; co...
阅读全文
摘要:简单,找规律。#include#include#includeint main(){ int i,n,m; while(scanf("%d%d",&n,&m)!=EOF) { if(!n&&!m)break; if((n*m)%2==0) ...
阅读全文
摘要:找规律。#include#include#includeint main(){ int i,n; while(scanf("%d",&n)!=EOF) { i=n%3; if(i==1||i==2) printf("Kiki\n")...
阅读全文
摘要:/*n%m==0 n状态n>=2*m 先手决定谁来面对当前的状态,并且可以知道状态,所以先手必胜。*/#includeint min(int x,int y){ return xy?x:y;}int main(){ int n,m,i; while(scanf("%d%d",&n,...
阅读全文
摘要:http://blog.csdn.net/kk303/article/details/6692506 首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( >=1 )移到前面去..最后没有点可以移动的人输.. 首
阅读全文
摘要:抽象一下把距离当做石子个数。虽然在这里石子个数可以增加,但是不管怎么增加,不会影响结果,因为你增加了,必须会有减少的。 所以类似取石子,观察平衡状态,如果(x2-x1-1)^...==0,必输。 wa好几发,绝对值忘加了!
阅读全文
摘要:#include #include #include using namespace std; #define maxn 100010 #define lson l,m,rtv) r=m-1; else l=m+1; } return -1; } void pushup(int rt) { sum[rt]=sum[rt=L&&R>=...
阅读全文
摘要:尼姆博弈的性质。最后一个取输。若a1^a2^a3...^a4=0表示利他态T,不然为利己态S。充裕堆:1个堆里的个数大于2.T2表示充裕堆大于等于2,T1表示充裕堆大于等于1,T0表示无充裕堆。S2表示充裕堆大于等于2,S1表示充裕堆大于等于1,S0表示无充裕堆。必败态:T2,S0;必胜态:S2,S...
阅读全文
摘要:如果 a1^a2^a3........^an=0,必败态。如果 a1^a2^a3........^an!=0,必胜态。对于必胜态,若a1^a2^a3........^an=k,要让对方为必败态,所以一定存在数,他的2进制有k的最高位上的1,使对方为必败态;所以如果k^a[i]#include#def...
阅读全文
摘要:有2堆石子,有2个人,每个人可以从一堆取或从2堆取一样的个数的石子,至少取1个。问先手的是胜或输。设(ak,bk)我么成为局势。 (0,0)(1,2)(3,5)(4,7)。。这种先手必输的叫奇异局势。bk=ak+k;三个性质: 1.任意自然数都包含在一个且只有一个奇异局势。 2.任意操...
阅读全文
摘要:n%(q+p)==0,也就是说先手必胜;n%(q+p)p&&kp&&k#includeint main(){ int i,n,p,q; while(scanf("%d%d%d",&n,&p,&q)!=EOF) { if(n%(q+p)==0) p...
阅读全文
摘要:简单。#include#includeint main(){ int i,t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(m>=n) printf("Gr...
阅读全文
摘要:简单。#include#includeint main(){ int i,t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(m>=n) printf("fi...
阅读全文
摘要:n表示先手胜 p表示先手负1~N N+1 N+2~2*N+1 2*N+2 2*N+3~3*N+2 ... n p n p n ...m总归个数 每次取1~N个根据前面的规律得到,如果m/N==m%N 那么必输,不然必胜。(...
阅读全文
摘要:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,...
阅读全文
摘要:题意简单思路也还可以。开始从小到大排序非常烦。后来从大到小就很简单了;从大到小解决了删除的边最小。#include#include#include#define maxn 100010using namespace std;#define LL long longstruct node{ in...
阅读全文
摘要:和hdu有一题差不多。给的是损失比,1-c%就是保存了多少,找出最大的保存率即可。#include #include #include#include using namespace std; #define inf 99999999 #define maxn 50010 #define ma...
阅读全文
摘要:考虑每次血口的要少 就按照一滴血多少伤害来计算。由于直接相除有小数。考虑x/y > a/b => x*b >y*a;#include#include#includeusing namespace std;struct node{ int hp; int dps;}a[25];bool c...
阅读全文
摘要:也可以字符串搞。dp思路还是很清晰的。dp[][0]表示未锁定,dp[][1]表示锁定键。#include#include#define maxn 110char s[maxn];int min(int x,int y){ return x0;i--) s[i]=s[i-...
阅读全文
摘要:想成数塔 把时间竖的看。#include#include#define maxn 100010int max(int x,int y){ return x>y?x:y;}int dp[12][maxn];int main(){ int i,j,n,T; while(scanf("%...
阅读全文
摘要:我思维比较差,平时也不敢碰dp,但是没办法必须学。这题虽然做了很久,修修改改很久,但是最后做出了,还是很好地。对于如果a[j]>a[i],并且j>i,那么i能跳到j,那dp[j]=max(dp[i]+a[j],dp[j]);如果不能跳转dp[j]=max(dp[j],a[j]);保证dp[j]最大。...
阅读全文
摘要:题意:如果有相同的字母,这些字母只输出一次。其余的都输出。先做一次LCS,标记相同的字母,然后回溯输出。#include#include#define maxn 110char s1[maxn],s2[maxn];int dp[maxn][maxn],map[maxn][maxn],len1,len...
阅读全文
摘要:dp[i][j]表示配对的最大值。dp[i-1][j]表示s1[i-1]与'-'配对.dp[i][j-1]表示s2[j-1]与'-'配对.dp[i-1][j-1]表示s1[i-1]与s2[j-1]配对。dp[i][j]=max(dp[i-1][j]+mp[s1[i-1]]['-'],dp[i][j-...
阅读全文
摘要:#includeint main(){ int i,t,n; int dp[50]; dp[1]=0; dp[2]=1; dp[3]=2; for(i=4;i<=40;i++) dp[i]=dp[i-1]+dp[i-2]; scanf("%d"...
阅读全文
摘要:/*每一种情况都可以由周围2个点得出*/#includeint main(){ __int64 dp[60]; int i,t,l,r; dp[1]=0; dp[2]=1; dp[3]=2; for(i=4;i<50;i++) dp[i]=dp[i-...
阅读全文
摘要:/*1~4直接取得;然后后面的生牛的时候都是前一年的加上一定的数。从第5年看,第五年出生的牛肯定要加上第四年出生的,然后由于第一个出生的牛开始生小牛,这和最开始的牛生孩子是一样的,所以+dp[i-3];*/#include#includeint dp[60];int main(){ int i...
阅读全文
摘要:比较简单。#include#include#include#define kind 96#define maxn 2000000struct node{ node *fail; node *next[kind]; int flag; int id; void init(...
阅读全文
摘要:MLE无数发。后来换了c++交过了。。。来个标记数组即可。#include#include#include#include#define maxn 10010using namespace std;struct actrie{ actrie *fail; actrie *next[94]...
阅读全文
摘要:字典树也可以做。#include#include#include#define maxn 1000010struct ac_mation{ ac_mation *fail;//失败指针 ac_mation *next[26];//26个字母 int flag;//标记是否为最后一个...
阅读全文
摘要:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包...
阅读全文
摘要:#include#include#define maxn 1201char c[300][301],s[maxn];int col;int getmax(){ int i,j,len=strlen(s); int max=0; for(i=0;imax) ma...
阅读全文
摘要:二分匹配简单题,看懂题意,建图比较重要。#include#include#define maxn 1100int map[maxn][maxn];int a[maxn],b[maxn],match[maxn],vis[maxn];int n,m;void makemap(){ int i,j,...
阅读全文
摘要:扩展KMP的简单题。#include#include#define maxn 51010char s[maxn],t[maxn];int extand[maxn],next[maxn];void getnext(char *t){ int i,k,j,len=strlen(t); nex...
阅读全文
摘要:#include#include#define maxn 10010int a[maxn],dp[maxn];int main(){ int n,i,j,max,flag,l,r,fl; while(scanf("%d",&n)!=EOF) { if(n==0) ...
阅读全文
摘要:分三种情况。至少取一种 那可以直接取 或者从上一种情况来取.dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].c]+a[j].v,dp[i][k-a[j].c]+a[j].v);至多取一种 只能从上一种情况来取 dp[i][k]=max(dp[i][k],dp[i-1][k-...
阅读全文
摘要:#include#include#define maxn 501000char s[maxn],t[maxn];int next[maxn],extand1[maxn],extand2[maxn];int ans[30],sum[maxn];void getnext(int *next,char *...
阅读全文
摘要:慢慢研究可以发现,可以用扩展kmp来求。由于扩展kmp的next[]只有一部分,当前位子前面那部分和母串的后部分,所以可以将字符串复制接在后面一次。先求如果next[]>0&&next[]!=len,那么只要考虑后面那位的大小比较。如果next[]>=len 那就是相同。如果next[]==0,就是...
阅读全文
摘要:刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html论文讲的非常详细。给定母串S,子串T,n=strlen(S),m=stlrne(T);extand[i]=S[i...n]与T的最长公共前缀长度,要在线性时间求出所有exta...
阅读全文
摘要:#include#include#include#define maxn 10struct trie{ trie *next[10]; int sum; int flag;};trie *root;char way[5010][10];void init(){ root=(t...
阅读全文
摘要:给你一堆字符串,然后再给你几个查询,前面那些字符串中有多少个包含了这个串。所以可以把开始inset()的字符遍历一遍,同时可能出现该字符串在某个字符串中有多次出现,所以还要用flag标记,来区分不同的串。#include#include#includestruct trie{ int flag...
阅读全文
摘要:#include#include#define maxn 10010char s[maxn];int getmin(){ int i,j,k,len=strlen(s); i=0; j=1; k=0; while(i0) i+=k+1; ...
阅读全文
摘要:#include#include#define maxn 1000010int next[maxn],s[maxn],p[maxn];int n,m;void getnext(){ int j,k; k=-1; j=0; next[0]=-1; while(j<m) ...
阅读全文
摘要:这题要求的是字符串左移时字典序最小和最大的第几次出现,并求出现次数。考虑一会可以发现,出现次数和循环节是有关系的。出现了几次,就是循环了几次,如果循环节是他本身,也就是无循环,那这个字符串不管怎么移,都只有一种情况。关键就是求第几次出现,也就是最大最小的表示。顺便学习了一下。#include#inc...
阅读全文
摘要:http://wenku.baidu.com/link?url=1hkGv3wY1CFD17E5RsyfFUCSPBmEJHfyaJZHLXIPnp1wHG54OyMGgLhVCwdt7YuEGENhnGyH7AJeC85giBGXrZg6dW6fdIU2-n7jQiLY9XG循环字符串的最小表示法...
阅读全文
摘要:这题琢磨了挺长的时间。需要理解next[]表示了什么;next[i]代表了前缀和后缀的最大匹配的值,也就是个数。len-next[len]表示循环节的长度;比如abcab int fl=len-next[len]=3;循环节长度为3,即cab。然后int len=strlen(s)=5;如果len...
阅读全文
摘要:2个字符长合并在一起即可。要注意next[n]的值要小于初始的两个字符串的长度;//next[]存的是之前相同的长度。//也是位置,只是s[i]不一定和s[next[i]]相同 //但是i之前的和next[i]之前相同的个数==next[i];#include#include#define maxn...
阅读全文
摘要:稀里糊涂1A开心。我做了2次kmp,先第一次利用next[],由于next[]前面一小段一直是一样的,所以可以根据这个来找。然后就找到了开头和结尾,还缺中间的部分。中间的部分就是通过开头部分去模式匹配,如果有就直接输出,break就可以。(因为开始长度最长)#include#include#defi...
阅读全文
摘要:求循环节。#include#include#define maxn 1000010int next[maxn];char s[maxn];void getnext(){ int j,k,len=strlen(s); j=0; k=-1; next[0]=-1; whil...
阅读全文
摘要:需要理解next[]的意义。之前看到大牛的博客,next[]讲的非常清楚。利用next[],当前位子的前面那一段和next[当前位子]的前面那一段是相同的。又next[next[当前位子]]与next[当前位子]有一段相同,所以当前位子的前面一段和next[next[当前位子]]的前一段有相同即可。...
阅读全文
摘要:Cellphone TypingTime Limit:5000msMemory Limit:131072KBThis problem will be judged on UVA. Original ID:1252664-bit integer IO format:%lld Java class na...
阅读全文
摘要:简单KMP 求单词出现的次数。直接可以考虑,在每一次匹配成功时,让ans++,k=next[k],直到结束。#include#include#define maxn 1000010#define ll 100010int next[ll];char s[maxn],p[ll];void getnex...
阅读全文
摘要:kmp简单题 找循环节。由于KMP的next[]数组,所以可以考虑最后一组的情况,及next[n]的值;n-next[n]的值表示一个循环节。如果n%(n-next[n])!=0表明该循环不成立。不然就是直接得到。#include#include#define maxn 1000010int nex...
阅读全文
摘要:大牛的好文 http://www.cnblogs.com/tangzhengyue/p/4315393.html下图摘自链接大牛的博客1.由"next[j] == k;"这个条件,我们可以得到A1子串 == A2子串(根据next数组的定义,前后缀那个)。2.由"next[k] == 绿色色块所在的...
阅读全文
摘要:#include#include#includeusing namespace std;#define lson l,m,rt0) sum[rt]=1; else sum[rt]=-1; return ; } int m=(l+r)/2;...
阅读全文
摘要:题目简化后最终要求的就是第二大的数。但是由于数据较大,不能直接求。可以先预处理,求出所有情况。#include#include#includeusing namespace std;struct node{ int from; int to;};struct Node{ int m...
阅读全文

浙公网安备 33010602011771号