实例介绍
上海大学邝斌的ACM竞赛模板,包含多种ACM竞赛算法的模板以及解释。还有例如划分树,主席树,高精度等模板。
上海大学ACM模板 by kuangbin hi1e(-1!=j88×[i]!=x[]))= kmpNext[]; if(x[++i]==x[++j])KImpNext[i]=kimpNext[j]i else kmpNext[i]=ji 返回x在y中出现的次数,可以重叠 int rext:10010] int KMP Count(char x[]rint m, char y[]r int r /x是模式串,y是主串 nt in七 //preAMP(, m, next. while(i<n) while(-1!! =] && y[il! =x[3)j=next[ji 1++;j++; if(i>=m) i=next[i] return ans 经典题目:POJ3167 大PoJ3167 CoW Patterns 大模式串可以浮动的模式匹配问题 给出模式的相对大小,需要找出模式串匹配次数和位置 比妇说模式串:1,4,4,2,3,1而主串:5,5,2,10,10,7,3,2,9 *那么2,10,10,7,3,2航是匹配的 统计比当前数小,和于当前数相等的,然后进行kmp #include <iostream> #include <stdio.h> Include <string.h> Include <algorithm> #include <vector> using namespace std const int MAxN=100010 const int MeⅩM=25010; int a [axn]i intb「MAxN1; int r, ms int as [MAXn][30]; int bs [MAXm][30] void init( for (int 1=0; i<n:i++) 3/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin f(i==0) for(int=1:j<=25;j++)as[主][j=0; lse for(inti=1;j=25;++)as[i][j:=as[i-1[]; s[i][a[i]]++; for(int i-0; i<m; i++) iE(i==0) for (int:=1:j<=2573++)bs[i][j:=0i else for(inti=1;j<=25;j++)bs[i][j.=bs[i-1.[] s[i][b[i]]+ int rext MAXM] void kmp pre() int i while(i<m) intt11=0,-12=0,t21=0,t22=0 for(int k=li k<lili k++) if(i-j>0)t11+=bs[i][k]-bs[i-j-1][k] lse t1+=bs[i[k]i if(i-]>0)t12-bs「il「b「i11-s「i--1l「b「i11; else tl2=bail lilli for (int k=lik<b[jli k++) t21+=bs][k] t22-bs「j1「b「11; if(=--1||(t11--t21t12--t22) next[++]=++j; else j=nex=[j] vector<int>arsi void kmp( ans clear( nt i, j p pre()i 4/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin while(i<n) intt11=0,-12=0,t21=0,t22=0 for (int k=li k<a[ k++) f(1-j>0)t11+=as[i][k]-as[i-j-1][k]; else tl+=as[i:[kli if(i-1>0)t12=as[i][a[i]]-as[--1][a[i]]; 1set12-as「i1[a「i11; for (int k=li k<b[jli k++) t21+=bs:][k] t22=bs[i]b[]]; if(---1||(t11--t21&t12=t22) ++; if(i>=m) ns. push back(i-m+ i=next[i]i else j=nex=[]]i int main( while(scanf(oddo",&n,&m,&s)==3) f。r(inti=0;i<n;i++) scanf("%d",&a[-]); for (int i-0 i<mi++) scanf("d",&bl=])i init(i printf("Bd\n", ans size())i for (int i-0ii<an2 sizc(i++) printf(d\n, ans [i1)i 2、扩展KMP 大扩展KMP算法 //next「i:x「i..n-11与x「0..m-11的最长公共前缀 5/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin / extend i]:y[i..n-1]与x[0.m-1的最长公共前缀 void pre ERMP(char x[]rint Il, int next[]) next[0l=m; in七 wh11e(j+1<m&&x[j]==x[j+1])j++; next[1]=ji t k=1 for(int i=2; i<n;i++) intp=ncxt「k1+k-1; in七I=next[i-k]; if (i+L<p+1)next[i]=l else J=nax(0,p while(i--<m && x[1+1]==x[3])3-+i k t void EKMP(char x]r int m, char y] int n, int next[], int extend. prc EKMP(x, m, ncxt)i int j=0 while(i<n & j<m & x[j]==y [3])3++ extend[0]=j int k= for(int i=l;i<n:i++) int p=extend[k]+k-li int I=next[i-kI if(i+L<p+l)exten[i]=Li else =max(0,p-1+1) WhLe(1-<.&&j<my「+j]=-x「1)j+一 tend[=1=j; k=i 3、 Manacher最长回文子串 大求最长回文子串 const int MAxN=l-0010 char Ma lmaXn*2」; int Mp [MAXN*2] void Manacher(char s[], int len Ma1++1-'S'; 6/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin Ma[1++]=t for (int i=0;i<len; i++) Ma[1++]=s[i] int mx=0, id=0; for(int i=0;i<l:i++) Mp「i1-mx>i?min(Mp「2*d-i1,mx-1):1 while(Ma[itMp [i]]==Ma li-Mp [i ])Mp[i]++i if(立+Mp[i]>mx) mx=⊥+Mp.⊥] baab: 012345678910111213 A Ma[i]: s # a b# a# a s bt a f 大Mpi]:11214127214121 char s [maxn] int main( while(scanf("%s" s)==1) int len=strlen(s)i Manacher (s,len)i int ans=0 E。r(inti=0;i<2*1en+2;i++) ans=max(ans, Mp.i]-1)i printf("c\n",ans)i 4、AC自动机 /HDU2222 /求目标串中出现了几个模式串 #主nc1ude< stdio.h> #include <alccrithm> include <iostream> #include <string.h> #include <queue> using namespace std; struct Trie int noκt「50001~1「261,fai1「500101,cnd「5000101 7/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin nt root, t int newnode( f。x(nti=0冫i<26;i++) next[L」i]= end[L++]=0 return L-1 t() 七 newnode(i void insert(char buf[l int len= strlen(buf) int now rooti for(int i=0; i lcn;i++) if(rext non] [buf[i]-'a]==--) next [now] [buf[il-a= newnode()i Ll nd[now]++ void build( queT fail[root]= rooti for(int i =0;i 26; 1++) i£( ext root][]==-1) ext[root][i」 oot else ail[next [root][i]]= rooti Q push(next[root][i]); while( int now =Qtront(; Q. pop( for(int i=0;-<25;i- if(next [now][il next [nowl[il next[fail [now]][i]i fail [nexlnow][i]=next fail[nowl][il C push(next[now][i])i nt (char buf[]) nt l strlen(buf) 七n t re for(int i =0; i len; i++) 8/173 模板 kuangbin 上海大学ACM模板 by kuangbin int temp =now; while( temp root i es + endltemp] d[temp]=0 temp=三ai1[temp]; return res oid del for(int i =0:i Tii++) printf("id =93d, fail =3d, end=3d, chi =[",i, fai=[i], end[i]) for(int=0;<25;j-+) printf ( 2d print("]\:"); char bu:100~010; Trie aci int main( int T int n scanf( od"&T) while(T--) scanf(d',&n)i ac init(; for (int 1=0 scanf ("os"bus cinsert(buf) ac build(); scanf("s" , buf)i printf("c\n", ac query (b 1f)) return 0 5、后缀数组 51DA算法 女 suffix array 倍增算法0(n*1ogn 待排序数组长度为n,放在0~:-1中,在最后面补一个0 A da(str n+l, sa rank, height );//注意是n+1; 例如 n num[]={1,1,2,1,1,1,1,2,s};注意num最后一位为0,其他大于0 9/173 AcM模板 kuangbin 上海大学ACM模板 by kuangbin 大rank[]={,6,8,1,2,3,5,7,0};rank[0~n-11为有效值,rank[-]必定为0无效 值 ssa[]={8,3,4,5,0,6,1,7,2};sa[~n]为有效值,sa[0]必定为n是无效值 *height 0,0,3,2,3,1,2,0,1); height[2~:为有效值 const int maxn=20010 intt1[MAxN],t2[MAxN], C MAXN];//求SA数组需要的中间变量,不需要赋值 //待排序的字符串放在s数组中,从s[0]到s[n-11,长度为n,且最大值小丁mn //除s[n-1]外的所有s[i1都大于0,r[n-1]=0 //函数结束以后结果放在sa数组中 b。o1cmp(int*≌,inta,intb,int1) return r[a ==r[bl &8 r[a+l] ==r[b+ void da(int str[,int sa[], int rank[]r int eight[], int n, int r1) i卫七 J, p tl, * y =t2 /第一轮基数排序,如果s的最大值很大,可改为快速排序 r(i=0, ;i++)c[ for(i=0 )c[x[i:=stx[=]] fox(i=1;1< f。x(i=n-1;i>=0;i--)sa [x[i]]=1; fox(j-1:<-n;j<<-1) //直接利用sa数组排序第二关键字 for(⊥=1-] i++)y[p-+]=i;//后面的个数第二关键字为空的最小 for(i =0;i<n; l-+)if(sai]>=j)y[p++]= sa[i] -j; /这样数组y保存的就是按照第二关键字排序的结果 //基数排序第一关键字 for(1=0;1<m:i-+)c[i」 fo(i=0;1<n;i-+)c[x[yi]]]++ for(i =1: i< m:i+-)c[i] for (i=11-1 0;--)sa[--C[x[y立]]] y[i] /根据sa和x数组计算新的x数组 a0l=0 fox(1=1;i<n;i++) [sa[il]= cmp(y, sa[i-1], sa[i1,3)?p 十+; if(r n)break /下次基数排序的最大值 nt k -0i for (i =0;i<=nii++rankisalil for(i=0;1<n;i++) if(kk-- []-1]; while(str[i+k] = str[j+k1)k++ height [rank [i]]=k int rank. MAXN], height [maXn]i int mm [MAXn]i 10/173 AcM模板 kuangbin 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论