模板集合——持续更新中
首先
sro_Cydiater_orz
sro_姬树流_orz
两位开搞模板集合已久的大神
1、对拍
1 @echo off 2 set path=C:\MinGWStudio\MinGW\bin 3 g++ -o makedata.exe makedata.cpp 4 g++ -o right.exe right.cpp 5 g++ -o test.exe test.cpp 6 set path=C:\Windows\system32 7 :loop 8 makedata.exe 9 right.exe 10 test.exe 11 fc cout1.out cout2.out 12 if errorlevel==1 pause 13 goto loop
2、fread
1 char buf[1<<15],*fs,*ft; 2 inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} 3 inline int read() 4 { 5 int x=0,f=1; char ch=getc(); 6 while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} 7 while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} 8 return x*f; 9 }
3、fwrite
1 char buf[1<<15],*fs=buf,*ft=buf+(1<<15); 2 #define ot(x) (fs==ft?fwrite(buf,1,1<<15,stdout),*(fs=buf)++=x:*fs++=x) 3 inline void print(int x) 4 { 5 if(x<0) {ot(45);x=-x;} 6 static char s[15],*b; b=s; 7 if(!x)*b++=48; 8 for(;x;*b++=x%10+48,x/=10); 9 for(;b--!=s;ot(*b)); 10 }
4、倍增求LCA
1 void dfs(int x,int fa) 2 { 3 anc[x][0]=f[x]; 4 for(int i=1;i<=20;i++) anc[x][i]=anc[anc[x][i-1]][i-1]; 5 for(int i=Link[x];i;i=e[i].next) 6 if(e[i].y!=fa) 7 { 8 f[e[i].y]=x; 9 deep[e[i].y]=deep[x]+1; 10 dfs(e[i].y,x); 11 } 12 } 13 int lca(int x,int y) 14 { 15 if(deep[x]<deep[y]) swap(x,y); 16 for(int i=20;i>=0;i--) if(deep[anc[x][i]]>=deep[y]) x=anc[x][i]; 17 if(x==y) return x; 18 for(int i=20;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i]; 19 return f[x]; 20 }
5、树链剖分
1 void dfs1(int x) 2 { 3 dep[x]=dep[f[x]]+1; size[x]=1; 4 for(int i=a[x];i;i=e[i].next) 5 if(e[i].y!=f[x]&&!f[e[i].y]) 6 { 7 f[e[i].y]=x; 8 dfs1(e[i].y); 9 size[x]+=size[e[i].y]; 10 if(size[son[x]]<size[e[i].y]) son[x]=e[i].y; 11 } 12 } 13 void dfs2(int x) 14 { 15 if(x==son[f[x]])top[x]=top[f[x]]; else top[x]=x; 16 for(int i=a[x];i;i=e[i].next) if(f[e[i].y]==x) dfs2(e[i].y); 17 }
6、Treap
1 struct data{int l,r,v,size,fix,w;}tr[100005]; 2 int n,len,root,ans; 3 void update(int k){tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;} 4 void rturn(int &k){int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;tr[t].size=tr[k].size;update(k);k=t;} 5 void lturn(int &k){int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;tr[t].size=tr[k].size;update(k);k=t;} 6 void insert(int &k,int x) 7 { 8 if(k==0){len++;k=len;tr[k].size=tr[k].w=1;tr[k].v=x;tr[k].fix=rand();return;} 9 tr[k].size++; 10 if(tr[k].v==x)tr[k].w++;//每个结点顺便记录下与该节点相同值的数的个数 11 else if(x>tr[k].v){insert(tr[k].r,x);if(tr[tr[k].r].fix<tr[k].fix)lturn(k);} 12 else {insert(tr[k].l,x);if(tr[tr[k].l].fix<tr[k].fix)rturn(k);} 13 } 14 void del(int &k,int x) 15 { 16 if(k==0)return; 17 if(tr[k].v==x) 18 { 19 if(tr[k].w>1){tr[k].w--;tr[k].size--;return;} 20 if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r;//有一个儿子为空 21 else if(tr[tr[k].l].fix<tr[tr[k].r].fix) rturn(k),del(k,x); 22 else lturn(k),del(k,x); 23 } 24 else if(x>tr[k].v) tr[k].size--,del(tr[k].r,x); 25 else tr[k].size--,del(tr[k].l,x); 26 } 27 int rank(int k,int x) 28 { 29 if(k==0) return 0; 30 if(tr[k].v==x) return tr[tr[k].l].size+1; 31 else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+rank(tr[k].r,x); 32 else return rank(tr[k].l,x); 33 } 34 int Findkth(int k,int x) 35 { 36 if(k==0)return 0; 37 if(x<=tr[tr[k].l].size) return Findkth(tr[k].l,x); 38 else if(x>tr[tr[k].l].size+tr[k].w) return Findkth(tr[k].r,x-tr[tr[k].l].size-tr[k].w); 39 else return tr[k].v; 40 } 41 void get_before(int k,int x) 42 { 43 if(k==0)return; 44 if(tr[k].v<x) ans=k;get_before(tr[k].r,x); 45 else get_before(tr[k].l,x); 46 } 47 void get_behind(int k,int x) 48 { 49 if(k==0)return; 50 if(tr[k].v>x) ans=k;get_behind(tr[k].l,x); 51 else get_behind(tr[k].r,x); 52 }
7、替罪羊树
1 #define INF 1000000000 2 const double chty=0.75; //平衡常数 3 struct node{int son[2],f,size,v;}tr[100005]; 4 int n,len,root,top,stack[100005]; 5 void init() 6 { 7 len=2; root=1; 8 tr[1].size=2; tr[1].v=-INF; tr[1].son[1]=2; 9 tr[2].size=1; tr[2].v=INF; tr[2].f=1; 10 } 11 bool balance(int x) 12 { 13 double p=tr[x].size*chty; 14 return p>=(double)tr[tr[x].son[0]].size&&p>=(double)tr[tr[x].son[1]].size; 15 } 16 void dfs(int x)//中序遍历 17 { 18 if(!x) return; 19 dfs(tr[x].son[0]); 20 stack[++top]=x; 21 dfs(tr[x].son[1]); 22 } 23 int build(int l,int r) 24 { 25 if(l>r) return 0; 26 int mid=(l+r)/2,x=stack[mid]; 27 tr[tr[x].son[0]=build(l,mid-1)].f=x; 28 tr[tr[x].son[1]=build(mid+1,r)].f=x; 29 tr[x].size=tr[tr[x].son[0]].size+tr[tr[x].son[1]].size+1; 30 return x; 31 } 32 void rebuild(int x) 33 { 34 top=0; dfs(x); 35 int fa=tr[x].f,which=(tr[fa].son[1]==x); 36 int sonroot=build(1,top); 37 tr[tr[fa].son[which]=sonroot].f=fa; 38 if(x==root) root=sonroot; 39 } 40 int find(int v) 41 { 42 int now=root; 43 while(now) 44 { 45 if(v==tr[now].v) return now; 46 else now=tr[now].son[v>tr[now].v]; 47 } 48 } 49 void insert(int v) 50 { 51 int now=root,p=++len; 52 tr[p].v=v; tr[p].size=1;//新开结点 53 while(1) 54 { 55 tr[now].size++; 56 int which=(v>=tr[now].v);//表示p在当前根的哪个子树内 57 if(tr[now].son[which]) now=tr[now].son[which]; 58 else {tr[tr[now].son[which]=p].f=now; break;} 59 } 60 int id=0; 61 for(int i=p;i;i=tr[i].f) if(!balance(i)) id=i;//记录不平衡点 62 if(id) rebuild(id);//重构子树 63 } 64 void del(int x) 65 { 66 if(tr[x].son[0]&&tr[x].son[1]) 67 { 68 int p=tr[x].son[0]; 69 while(tr[p].son[1]) p=tr[p].son[1]; 70 tr[x].v=tr[p].v; x=p; 71 } 72 int Son=(tr[x].son[0])?tr[x].son[0]:tr[x].son[1],which=(tr[tr[x].f].son[1]==x); 73 tr[tr[tr[x].f].son[which]=Son].f=tr[x].f; 74 for(int i=tr[x].f;i;i=tr[i].f) tr[i].size--; 75 if(x==root) root=Son; 76 } 77 int rank(int v) 78 { 79 int now=root,ans=0; 80 while(now) 81 { 82 if(tr[now].v<v) {ans+=tr[tr[now].son[0]].size+1; now=tr[now].son[1];} 83 else now=tr[now].son[0]; 84 } 85 return ans; 86 } 87 int kth(int x) 88 { 89 int now=root; 90 while(1) 91 { 92 if(tr[tr[now].son[0]].size==x-1) return now; 93 else if(tr[tr[now].son[0]].size>=x) now=tr[now].son[0]; 94 else x-=tr[tr[now].son[0]].size+1,now=tr[now].son[1]; 95 } 96 return now; 97 } 98 int before(int v) 99 { 100 int now=root,ans=-INF; 101 while(now) 102 { 103 if(tr[now].v<v) ans=max(ans,tr[now].v),now=tr[now].son[1]; 104 else now=tr[now].son[0]; 105 } 106 return ans; 107 } 108 int after(int v) 109 { 110 int now=root,ans=INF; 111 while(now) 112 { 113 if(tr[now].v>v) ans=min(ans,tr[now].v),now=tr[now].son[0]; 114 else now=tr[now].son[1]; 115 } 116 return ans; 117 }
8、kmp
1 void pre(){int j=0;for(int i=2;i<=m;i++){while(j>0&&b[j+1]!=b[i])j=p[j];if(b[j+1]==b[i])j++;p[i]=j;}} 2 void kmp(){int j=0;for(int i=1;i<=n;i++){while(j>0&&b[j+1]!=a[i])j=p[j];if(b[j+1]==a[i])j++;if(j==m)printf("%d\n",i-m+1);}
9、AC自动机
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<ctime> 7 #include<algorithm> 8 #include<iomanip> 9 using namespace std; 10 #define MAXN 1000100 11 int n,cnt,q[MAXN],fail[MAXN],end[MAXN],tr[MAXN][26]; 12 char ch[MAXN]; 13 void insert() 14 { 15 int now=0; 16 for(int i=1;i<=strlen(ch+1);i++) 17 { 18 if(!tr[now][ch[i]-'a']) tr[now][ch[i]-'a']=++cnt; 19 now=tr[now][ch[i]-'a']; 20 } 21 end[now]++; 22 } 23 void build() 24 { 25 int head=0,tail=0; 26 for(int i=0;i<26;i++) if(tr[0][i]) q[++tail]=tr[0][i]; 27 while(++head<=tail) 28 { 29 int x=q[head]; 30 for(int i=0;i<26;i++) 31 { 32 if(!tr[x][i]) tr[x][i]=tr[fail[x]][i]; 33 else fail[tr[x][i]]=tr[fail[x]][i],q[++tail]=tr[x][i]; 34 } 35 } 36 } 37 void find() 38 { 39 scanf("%s",ch+1); int x=0,ans=0; 40 for(int i=1;i<=strlen(ch+1);i++) 41 { 42 while(x&&!tr[x][ch[i]-'a'])x=fail[x]; x=tr[x][ch[i]-'a']; int temp=x; 43 while(temp){ans+=end[temp];temp=fail[temp];} 44 } 45 printf("%d\n",ans); 46 } 47 int main() 48 { 49 freopen("cin.in","r",stdin); 50 freopen("cout.out","w",stdout); 51 scanf("%d",&n); 52 for(int i=1;i<=n;i++) {scanf("%s",ch+1); insert();} 53 build(); 54 find(); 55 return 0; 56 }
10、后缀数组
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<ctime> 6 #include<cmath> 7 #include<algorithm> 8 using namespace std; 9 #define FILE "read" 10 #define MAXN 100010 11 int n,rank[MAXN],sa[MAXN],p[MAXN],cnt[MAXN],tmp[MAXN],height[MAXN]; 12 char s[MAXN]; 13 namespace Suffix_Array{ 14 bool equ(int x,int y,int l) {return rank[x]==rank[y]&&rank[x+l]==rank[y+l];} 15 void doubling(){ 16 for(int i=1;i<=n;i++) rank[i]=s[i],sa[i]=i; 17 for(int pos=0,l=0,i,sig=255;pos<n;sig=pos){ 18 for(i=n-l+1,pos=0;i<=n;i++) p[++pos]=i; 19 for(i=1;i<=n;i++) if(sa[i]>l) p[++pos]=sa[i]-l; 20 for(i=1;i<=sig;i++) cnt[i]=0; 21 for(i=1;i<=n;i++) cnt[rank[i]]++; 22 for(i=1;i<=sig;i++) cnt[i]+=cnt[i-1]; 23 for(i=n;i;i--) sa[cnt[rank[p[i]]]--]=p[i]; 24 for(i=1,pos=0;i<=n;i++) tmp[sa[i]]=equ(sa[i],sa[i-1],l)?pos:++pos; 25 l=!l?1:l<<1; 26 } 27 } 28 void gethight(){ 29 for(int i=1,j=0,k;i<=n;i++){ 30 if(!(k=sa[rank[i]-1])) {j=0; continue;} 31 if(j) j--; 32 while(s[i+j]==s[k+j]) j++; 33 height[rank[i]]=j; 34 } 35 } 36 }
11、归并排序
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<ctime> 6 #include<cmath> 7 #include<algorithm> 8 using namespace std; 9 #define FILE "read" 10 #define up(i,j,n) for(int i=j;i<=n;i++) 11 int n,a[10010]; 12 namespace Init{ 13 char buf[1<<15],*fs,*ft; 14 inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} 15 inline int read(){ 16 int x=0,f=1; char ch=getc(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} 18 while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} 19 return x*f; 20 } 21 } 22 namespace GB_Sort{ 23 int c[10010],len(0); 24 void dfs2(int l,int r){ 25 int mid=(l+r)>>1,i=l,j=mid+1,len=l-1; 26 while(i<=mid&&j<=r){ 27 if(a[i]>a[j]) c[++len]=a[j++]; 28 else c[++len]=a[i++]; 29 } 30 while(i<=mid) c[++len]=a[i++]; 31 while(j<=r) c[++len]=a[j++]; 32 up(i,l,r) a[i]=c[i]; 33 } 34 void dfs1(int l,int r){ 35 if(l<r){ 36 int mid=(l+r)>>1; 37 dfs1(l,mid); dfs1(mid+1,r); 38 dfs2(l,r); 39 } 40 } 41 } 42 void init(){ 43 n=Init::read(); 44 up(i,1,n) a[i]=Init::read(); 45 } 46 void output() {up(i,1,n) printf("%d ",a[i]); printf("\n%d\n",ans);} 47 int main(){ 48 freopen(FILE".in","r",stdin); 49 freopen(FILE".out","w",stdout); 50 init(); 51 GB_Sort::dfs1(1,n); 52 output(); 53 return 0; 54 }
12、高精度
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<ctime> 6 #include<cmath> 7 #include<algorithm> 8 using namespace std; 9 typedef long long ll; 10 #define FILE "read" 11 #define up(i,j,n) for(ll i=j;i<=n;i++) 12 #define down(i,j,n) for(ll i=j;i>=n;i--) 13 struct node{ll num[20010],len;}A,B; 14 char ch1[20010],ch2[20010]; 15 namespace High{ 16 node add(node a,node b){//高精度加法 17 ll len=max(a.len,b.len); 18 node c; 19 up(i,1,len){ 20 c.num[i]+=a.num[i]+b.num[i]; 21 while(c.num[i]>=10) c.num[i+1]++,c.num[i]-=10; 22 } 23 while(c.num[len+1]>0) len++; 24 c.len=len; 25 return c; 26 } 27 ll comp(node a,node b){//高精度数比较 28 if(a.len>b.len) return -1; 29 if(a.len<b.len) return 1; 30 down(i,a.len,1){ 31 if(a.num[i]>b.num[i]) return -1; 32 if(a.num[i]<b.num[i]) return 1; 33 } 34 return 0; 35 } 36 node Del(node a,node b){//高精度减法 37 node c; 38 ll len=max(a.len,b.len); 39 up(i,1,len){ 40 c.num[i]+=a.num[i]-b.num[i]; 41 if(c.num[i]<0) c.num[i]+=10,c.num[i+1]--; 42 } 43 while(c.num[len]==0&&len>1) len--; 44 c.len=len; 45 return c; 46 } 47 node del(node a,node b){ 48 if(comp(a,b)>0) {printf("-"); return Del(b,a);} 49 else return Del(a,b); 50 } 51 node mul(node a,ll b){//高精乘单精 52 node c; ll len=a.len; 53 memset(c.num,0,sizeof(c.num)); 54 up(i,1,len){ 55 c.num[i]+=a.num[i]*b; 56 if(c.num[i]>=10) c.num[i+1]=c.num[i]/10,c.num[i]%=10; 57 } 58 while(c.num[len+1]){ 59 len++; 60 if(c.num[len]>=10) c.num[len+1]=c.num[len]/10,c.num[len]%=10; 61 } 62 c.len=len; 63 return c; 64 } 65 node Mul(node a,node b){//高精乘高精 66 node c; c.len=1; 67 up(i,1,a.len) up(j,1,b.len){ 68 ll k=i+j-1; 69 c.num[k]+=a.num[i]*b.num[j]; 70 while(c.num[k]>=10) c.num[k+1]+=c.num[k]/10,c.num[k]%=10,k++; 71 if(k>c.len) c.len=k; 72 } 73 while(c.num[c.len]==0&&c.len>1) c.len--; 74 return c; 75 } 76 void div(node a,node b){//高精除高精(答案是单精) 77 ll l=0,r=2000000000,ans=0; 78 while(l<=r){ 79 ll mid=(l+r)>>1; 80 node c=mul(b,mid); 81 if(comp(c,a)>=0) {l=mid+1; ans=mid;} 82 else r=mid-1; 83 } 84 printf("%d\n",ans); 85 } 86 } 87 void init(){ 88 scanf("%s",ch1+1); 89 scanf("%s",ch2+1); 90 ll n=strlen(ch1+1); 91 ll m=strlen(ch2+1); 92 down(i,n,1) A.num[++A.len]=(ll)ch1[i]-'0'; 93 down(i,m,1) B.num[++B.len]=(ll)ch2[i]-'0'; 94 } 95 void output(node c){ 96 down(i,c.len,1) printf("%d",c.num[i]); 97 } 98 int main(){ 99 freopen(FILE".in","r",stdin); 100 freopen(FILE".out","w",stdout); 101 init(); 102 //node c=High::Mul(A,B); 103 //ll p; scanf("%d",&p); 104 //node c=High::mul(A,p); 105 //output(c); 106 //High::div(A,B); 107 return 0; 108 }