上一页 1 2 3 4 5 6 7 8 ··· 11 下一页
  2011年7月30日
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int a[1000010],b[10010];int next[10010];void get_next(){ int i=1,j=0; next[1]=0; while(i<b[0]) { if(b[i]==b[j]||j==0) { i++; j++; if(b[i]!=b[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } }}int index_kmp(){ 阅读全文
posted @ 2011-07-30 20:29 枫叶飘泪 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 模式匹配最原始的算法是BF算法:int index_bf(char *s,char *t){ int i,j; i=j=1; while(i<=s[0]&&j<=t[0]) { if(s[i]==t[j]) { i++; j++; } else//主串和模式串都回溯 { i=i-j+2; j=1; } } if(j>t[0])//匹配成功 { return i-t[0]; } else//匹配失败 { return 0; }}之后就是KMP算法,它是BF算法的一种优化,当主串匹配失败时,不必回溯,只需要将模式串回溯一部分即可,这样就大大节省了时间:int in 阅读全文
posted @ 2011-07-30 20:27 枫叶飘泪 阅读(291) 评论(0) 推荐(0) 编辑
  2011年7月27日
摘要: 拓展欧几里得算法解二元一次不定方程:a*x+b*y=m;因为:gcd(a,b)| a , gcd(a,b)| b ;所以:gcd(a,b)| a*x , gcd(a,b) | b*y ==> gcd(a,b)|(a*x+b*y) ==>gcd(a,b)|m ;所以要求a*x+b*y=m,可以先求a*x+b*y=gcd(a,b).对于:a*x+b*y=gcd(a,b)1.当b==0时,gcd(a,b)=a,此时x=1,y=0;2.先求出 a*x+b*y=gcd(a,b) 的一组解。因为 a*x1+b*y1=gcd(a,b) b*x2+a%by2=gcd(b,a%b)且 gcd(a,b 阅读全文
posted @ 2011-07-27 20:23 枫叶飘泪 阅读(2240) 评论(0) 推荐(1) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ int a; scanf("%d",&a); printf("%d\n%d\n",a>>1,a<<1); system("pause"); return 0;}一个数 a 若右移一位,则其数值减为 a/2(取整),若左移一位,则其数值变为 a*2;#include<stdio.h>#include<string.h> 阅读全文
posted @ 2011-07-27 17:37 枫叶飘泪 阅读(668) 评论(0) 推荐(0) 编辑
  2011年7月26日
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ int n,v[60],m[110]; int c1[250010],c2[250010]; while(scanf("%d",&n),n>0) { memset(v,0,sizeof(v)); memset(m,0,sizeof(m)); int sum=0; for(int i=1;i<=n;i++) { scanf("%d%d",&v[i],&m[i 阅读全文
posted @ 2011-07-26 15:17 枫叶飘泪 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 和找单词做了类似的处理,总之还是套模板。#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ int t,n,k,a[10],b[12]; int c1[1000],c2[1000]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(int i=1;i<=k;i++) { scanf("%d%d",&a[i],&b[i] 阅读全文
posted @ 2011-07-26 14:48 枫叶飘泪 阅读(426) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ int ch[27]; int c1[100],c2[100]; int n; scanf("%d",&n); while(n--) { memset(ch,0,sizeof(ch)); memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); for(int i=1;i<=26;i++) { scanf("%d",&ch[i] 阅读全文
posted @ 2011-07-26 10:45 枫叶飘泪 阅读(473) 评论(0) 推荐(0) 编辑
  2011年7月25日
摘要: 正确代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXSIZE 32780int c1[MAXSIZE],c2[MAXSIZE];int n;void fun(){ for(int i=0;i<MAXSIZE;i++) { c1[i]=1; c2[i]=0; } for(int i=2;i<=3;i++) { for(int j=0;j<MAXSIZE;j++) { for(int k=0;j+k<MAXSIZE;k+=i) { c2[j+k]+=c1 阅读全文
posted @ 2011-07-25 18:13 枫叶飘泪 阅读(214) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ int num1,num2,num3; int c1[10000],c2[10000];//万恶的数组,害我又一次纠结了,本来,我开1000的,结果一直wa,后来我在看了一下题目,发现竟然是说num-i<=1000,然后我们要求的数组的大小为num1*1+num2*2+num3*5的上限,为8000; while(scanf("%d%d%d",&num1,&num2,&num3), 阅读全文
posted @ 2011-07-25 17:05 枫叶飘泪 阅读(193) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>int main(){ int c1[310],c2[310]; int n; while(scanf("%d",&n),n) { for(int i=0;i<=n;i++) { c1[i]=1; c2[i]=0; } for(int i=2;i<=(int)sqrt(n);i++)//或者把限制条件改为i*i<=n; { for(int j=0;j<=n;j 阅读全文
posted @ 2011-07-25 15:36 枫叶飘泪 阅读(218) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 11 下一页