整理acm模板

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

}

}

vectorans;

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;

for(int k=1;k

{

if(i-j>0)t11+=as[i][k]-as[i-j-1][k]; else t11+=as[i][k];

}

if(i-j>0)t12=as[i][a[i]]-as[i-j-1][a[i]]; else t12=as[i][a[i]];

for(int k=1;k

{

t21+=bs[j][k];

}

t22=bs[j][b[j]];

if(j==-1 || (t11==t21&&t12==t22)) {

i++;j++;

if(j>=m)

相关文档
最新文档