代码模板(持续更新)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码模板(持续更新)相关的知识,希望对你有一定的参考价值。
字符串:
KMP算法:
1 int Next[maxn]; 2 3 void Get_Next(char *S,int len) 4 { 5 int i=0,j=-1; 6 Next[0]=-1; 7 while(i<len) 8 { 9 if(j==-1||S[i]==S[j]) 10 { 11 i++;j++;Next[i]=j; 12 } 13 else j=Next[j]; 14 } 15 } 16 17 void KMP(char *S,char *T,int lens,int lent) 18 { 19 Get_Next(T,lent); 20 int i=0,j=0; 21 while(i<lens) 22 { 23 if(j==-1||S[i]==T[j]) 24 { 25 i++;j++; 26 } 27 else j=Next[j]; 28 if(j==lent) 29 { 30 printf("%d\n",i-lent+1); 31 } 32 } 33 }
EX_KMP:
1 int Next[maxn],ext[maxn]; 2 3 void Get_Next(char *S,int len) 4 { 5 int k=0;Next[0]=len; 6 while(k+1<len&&S[k]==S[k+1]) k++; 7 Next[1]=k;k=1; 8 for(int i=2;i<len;i++) 9 { 10 if(Next[i-k]+i<Next[k]+k) Next[i]=Next[i-k]; 11 else 12 { 13 int j=max(0,Next[k]+k-i); 14 while(i+j<len&&S[i+j]==S[j]) j++; 15 Next[i]=j;k=i; 16 } 17 } 18 } 19 20 void EXKMP(char *S,char *T,int *extend,int lens,int lent) 21 { 22 Get_Next(T,lent); 23 int k=0; 24 while(k<lens&&k<lent&&S[k]==T[k]) k++; 25 extend[0]=k;k=0; 26 for(int i=1;i<lens;i++) 27 { 28 if(Next[i-k]+i<extend[k]+k) extend[i]=Next[i-k]; 29 else 30 { 31 int j=max(0,extend[k]+k-i); 32 while(i+j<lens&&j<lent&&S[i+j]==T[j]) j++; 33 extend[i]=j;k=i; 34 } 35 } 36 }
图论:
匈牙利算法:
1 vector<int> G[maxn]; 2 int vis[maxn],l[maxn]; 3 4 bool dfs(int u) 5 { 6 int len=G[u].size(); 7 for(int i=0;i<len;i++) 8 { 9 int v=G[u][i]; 10 if(!vis[v]) 11 { 12 vis[v]=1; 13 if(l[v]==-1||dfs(l[v])) 14 { 15 l[v]=u;return true; 16 } 17 } 18 } 19 return false; 20 } 21 22 int hungary(int n) 23 { 24 memset(l,-1,sizeof(l)); 25 int cnt=0; 26 for(int i=1;i<=n;i++) 27 { 28 memset(vis,0,sizeof(vis)); 29 if(dfs(i)) cnt++; 30 } 31 return cnt; 32 }
以上是关于代码模板(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章