整理acm模板
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、KMP 算法
/*
* next[]的含义:x[i-next[i]...i-1]=x[0...next[i]-1]
* next[i]为满足x[i-z...i-1]=x[0...z-1]的最大z值(就是x的自身匹配)
*/
void kmp_pre(char x[],int m,int next[]) {
int i,j;
j=next[0]=-1;
i=0;
while(i { while(-1!=j && x[i]!=x[j])j=next[j]; next[++i]=++j; } } /* * kmpNext[]的意思:next'[i]=next[next[...[next[i]]]] (直到next'[i]<0或者 x[next'[i]]!=x[i]) * 这样的预处理可以快一些 */ void preKMP(char x[],int m,int kmpNext[]) { int i,j; j=kmpNext[0]=-1; i=0; while(i { 上海大学ACM 模板by kuangbin 3 / 173 ACM 模板kuangbin while(-1!=j && x[i]!=x[j])j=kmpNext[j]; if(x[++i]==x[++j])kmpNext[i]=kmpNext[j] ; else kmpNext[i]=j; } } /* * 返回x在y中出现的次数,可以重叠*/int next[10010]; int KMP_Count(char x[],int m,char y[],int n) {//x是模式串,y是主串 int i,j; int ans=0; //preKMP(x,m,next); kmp_pre(x,m,next); i=j=0; while(i { while(-1!=j && y[i]!=x[j])j=next[j]; i++;j++; if(j>=m) { ans++; j=next[j]; } } return ans; } 经典题目:POJ 3167 /* * POJ 3167 Cow Patterns * 模式串可以浮动的模式匹配问题 * 给出模式串的相对大小,需要找出模式串匹配次数和位置 * 比如说模式串:1,4,4,2,3,1 而主串:5,6,2,10,10,7,3,2,9 * 那么2,10,10,7,3,2就是匹配的 * * 统计比当前数小,和于当前数相等的,然后进行kmp */ #include #include #include #include #include using namespace std; const int MAXN=100010; const int MAXM=25010; int a[MAXN]; int b[MAXN]; int n,m,s; int as[MAXN][30]; int bs[MAXM][30]; void init() { for(int i=0;i { 上海大学ACM 模板by kuangbin 4 / 173 ACM 模板kuangbin if(i==0) { for(int j=1;j<=25;j++)as[i][j]=0; } else { for(int j=1;j<=25;j++)as[i][j]=as[i-1][j]; } as[i][a[i]]++; } for(int i=0;i { if(i==0) { for(int j=1;j<=25;j++)bs[i][j]=0; } else { for(int j=1;j<=25;j++)bs[i][j]=bs[i-1][j]; } bs[i][b[i]]++; } } int next[MAXM]; void kmp_pre() { int i,j; j=next[0]=-1; i=0; while(i { int t11=0,t12=0,t21=0,t22=0; for(int k=1;k { if(i-j>0)t11+=bs[i][k]-bs[i-j-1][k];else t11+=bs[i][k]; } if(i-j>0)t12=bs[i][b[i]]-bs[i-j-1][b[i]]; else t12=bs[i][b[i]]; for(int k=1;k { t21+=bs[j][k]; } t22=bs[j][b[j]]; if(j==-1 || (t11==t21&&t12==t22)) { next[++i]=++j; } else j=next[j]; } } vector void kmp() { ans.clear(); int i,j; kmp_pre(); 上海大学ACM 模板by kuangbin 5 / 173 ACM 模板kuangbin i=j=0; while(i { int t11=0,t12=0,t21=0,t22=0;