上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 34 下一页
摘要: 比较裸的KMP#include<iostream>#include<algorithm>using namespace std;int n,m;char T[1000010],P[10010];int nxt[10010];int KMP(){ nxt[0] = -1; int k = -1; for(int q=1;q<=m-1;q++){ while (k > -1 && P[k+1] != P[q]) k = nxt[k]; if (P[k+1] == P[q]) ++k; nxt[q] = k; }... 阅读全文
posted @ 2011-11-09 15:46 枕边梦 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意:在文本T[1..n],找一个最长的后缀(长度为m,m<=13),以这个后缀为匹配的模式P:T[n-m+1..n]找出P在文本T[1..n-1]出现的最后一个起始位置k,(k<=n-m)若找到k,则得出T[n+1]为找到的模式T[k..k+m-1]的下一个位置: 即:T[n+1] = T[k+m]如果m==13时找不到,则尝试m==12直到m==1,如果都找不到,则T[n+1] = 0;分析:* KMP* 一旦得到一个匹配之后就增加源串长度 下次找匹配 T 和 P 都会变* 因为这次匹配之后 给源串增加的那个字符就是前面相匹配的串的下一个字符* 所以至少这个位置会继续匹配下去* 阅读全文
posted @ 2011-11-09 15:17 枕边梦 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,以前写的,刚刚突然看到的,就贴一下咯,KMP 的求next[]数组的活用,求最长重复字串pku2406#include <stdio.h>#include <stdlib.h>#include <string.h> char str [1000010];int next[1000010]; int getnext(){ int i= 0, j= -1; next[0]= -1; while( str[i] )//这个过程其实就是在求next[]数组 { if( j== -1 || str[i]== str[j] ) { ++i,++j; next[i] 阅读全文
posted @ 2011-11-07 02:46 枕边梦 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 呵呵,基本的并查集,合并之后,判断集合的个数即可#include<iostream>#include<algorithm>#define maxn 1010using namespace std;int f[maxn],n,m;void init(){ for(int i=0;i<maxn;i++) f[i]=i;}int find(int x){ if(x==f[x]) return x; f[x]=find(f[x]); return f[x];}//路径压缩void Union(int x,int y){ int a=find(x); int b=find( 阅读全文
posted @ 2011-11-05 22:21 枕边梦 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 题意:已知有N个不同的砝码,求这N个不同砝码不能称量的重量分析:与一般的母函数类似,只是还要多考虑一步,就是砝码并不定都放一边for(int i=1;i<=n;i++){for(int j=0;j<=maxn;j++){if(j+p[i]<=maxn)num1[j+p[i]]+=num[j];num1[abs(j-p[i])]+=num[j];//核心部分都加了这么一句}for(int j=0;j<=maxn;j++)num[j]=num1[j];}#include<iostream>#include<string.h>#include<a 阅读全文
posted @ 2011-11-02 22:30 枕边梦 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,又一道母函数不过这个没办法直接用之前大致的模板,因为之前的G(x)=(1+x+x^2)*(1+x^2+x^4)……每一个括号都有一个1,所以我没有将数组num1[]重新置为0,而现在G(x)=(x^a1+x^(a1+1)+……+x^b1)*(x^a2+x^(a2+1)+……+x^b2)……#include<iostream>#include<string>#include<algorithm>using namespace std;int maxn,n,m;struct neg{ int a,b;}c[110];int num1[110],num[11 阅读全文
posted @ 2011-11-02 21:59 枕边梦 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿还是一样的题目#include<iostream>#include<string>#include<algorithm>using namespace std;int p[4]={0,1,2,5};int c[4],maxn;int num1[10000],num[10000];void sovle(){ memset(num,0,sizeof(num)); memset(num1,0,sizeof(num1)); for(int i=0;i<=c[1];i++) num1[i]=num[i]=1; for(int i=2;i<4;i++) 阅读全文
posted @ 2011-11-02 20:32 枕边梦 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 哈,第二道母函数的题目,哎,不过那是因为函数比较明显G(x)=(1+x+x^2+x^3……+x^300)*(1+x^4+x^8+……)*……(1+x^289)直接模拟咯#include<iostream>#include<algorithm>#include<string>#define maxn 310using namespace std;int p[18]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289};int num[maxn+1],num1[maxn+1];void init( 阅读全文
posted @ 2011-11-02 19:39 枕边梦 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,先将每一个Fib打表,之后,就是很暴力的在区间内找咯。#include<iostream>#include<algorithm>#include<string>#include<math.h>#define maxn 600using namespace std;int sum[maxn+1][50],len1[maxn+1];int a[50],b[50],la,lb;char str1[110],str2[110];void init(){ sum[0][0]=0;len1[0]=0; sum[1][0]=1;len1[1]=0; su 阅读全文
posted @ 2011-10-31 22:51 枕边梦 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 哈,用java还有C++各交了一次C++版#include<iostream>#include<algorithm>using namespace std;int sum[201][50],len1[201];void init(){ sum[0][0]=0;len1[0]=0; sum[1][0]=1;len1[1]=0; sum[2][0]=2;len1[2]=0; for(int i=3;i<=200;i++) { int k=0,j; //cout<<i<<endl; for(j=0;j<=len1[i-2];j++) { i 阅读全文
posted @ 2011-10-31 17:15 枕边梦 阅读(189) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 34 下一页