ctsc前例行砍手
可并堆、并查集 zoj2334
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; #define SZ 666666 int ch[SZ][2],dis[SZ],v[SZ]; int merge(int a,int b) { if(!a||!b) return a+b; if(v[a]<v[b]) swap(a,b); ch[a][1]=merge(ch[a][1],b); if(dis[ch[a][0]]<dis[ch[a][1]]) swap(ch[a][0],ch[a][1]); if(!ch[a][1]) dis[a]=0; else dis[a]=dis[ch[a][1]]+1; return a; } int pop(int a) { int t=merge(ch[a][0],ch[a][1]); ch[a][0]=ch[a][1]=dis[a]=0; return t; } int ff[SZ],rot[SZ]; int gf(int x) {return ff[x]?ff[x]=gf(ff[x]):x;} int n,m; void sol() { for(int i=1;i<=n;i++) scanf("%d",v+i), ch[i][0]=ch[i][1]=dis[i]=ff[i]=0, rot[i]=i; scanf("%d",&m); while(m--) { int a,b; scanf("%d%d",&a,&b); int ga=gf(a),gb=gf(b); if(ga==gb) {puts("-1"); continue;} v[rot[ga]]/=2; v[rot[gb]]/=2; int aa=merge(pop(rot[ga]),rot[ga]); int bb=merge(pop(rot[gb]),rot[gb]); rot[ga]=merge(aa,bb); ff[gb]=ga; printf("%d ",v[rot[ga]]); } } int main() { while(scanf("%d",&n)!=-1) sol(); }
cdq分治 bzoj1176
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; int s,w,q=0,Q=0,ans[233333]; //tp=0 edit //tp=1 query //op: -1/1 for query // value for edit struct cq {int x,y,op,tp,qid;}qs[233333]; bool operator < (cq a,cq b) {return a.x<b.x;} int bits[2333333]; int sum(int x) { int ans=0; for(;x>=1;x-=x&-x) ans+=bits[x]; return ans; } void edit(int x,int y) { for(;x<=w;x+=x&-x) bits[x]+=y; } void cdq(int l,int r) { if(l>=r) return; int mid=(l+r)>>1; cdq(l,mid); cdq(mid+1,r); sort(qs+l,qs+mid+1); sort(qs+mid+1,qs+r+1); int cur=l; for(int i=mid+1;i<=r;i++) { if(qs[i].tp!=1) continue; int x=qs[i].x; while(cur<=mid&&qs[cur].x<=x) { if(qs[cur].tp==0) edit(qs[cur].y,qs[cur].op); ++cur; } ans[qs[i].qid]+=qs[i].op*sum(qs[i].y); } for(int i=l;i<cur;i++) if(qs[i].tp==0) edit(qs[i].y,-qs[i].op); } int main() { scanf("%d%d",&s,&w); int o,a,b,c,d; while(1) { scanf("%d",&o); if(o==1) { scanf("%d%d%d",&a,&b,&c); ++q; qs[q].x=a; qs[q].y=b; qs[q].tp=0; qs[q].op=c; } else if(o==2) { scanf("%d%d%d%d",&a,&b,&c,&d); ++Q; ++q; qs[q].x=a-1; qs[q].y=b-1; qs[q].tp=1; qs[q].op=1; qs[q].qid=Q; ++q; qs[q].x=c; qs[q].y=b-1; qs[q].tp=1; qs[q].op=-1; qs[q].qid=Q; ++q; qs[q].x=a-1; qs[q].y=d; qs[q].tp=1; qs[q].op=-1; qs[q].qid=Q; ++q; qs[q].x=c; qs[q].y=d; qs[q].tp=1; qs[q].op=1; qs[q].qid=Q; } else break; } cdq(1,q); for(int i=1;i<=Q;i++) printf("%d ",ans[i]); }
splay tyvj1729
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; #define SZ 666666 int n,m,ch[SZ][2],siz[SZ],vs[SZ],fa[SZ],root,an=0; bool rev[SZ]; void pd(int x) { if(!rev[x]) return; swap(ch[x][0],ch[x][1]); rev[ch[x][0]]^=1; rev[ch[x][1]]^=1; rev[x]=0; } void upd(int x) { siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1; } void rot(int x) { pd(fa[x]); pd(x); int y=fa[x],c=ch[y][0]==x; fa[x]=fa[y]; if(fa[y]) ch[fa[y]][ch[fa[y]][1]==y]=x; int h=ch[x][c]; ch[y][!c]=h; if(h) fa[h]=y; ch[x][c]=y; fa[y]=x; upd(y); upd(x); } int ss[SZ],sn=0; void splay(int x,int f) { int cur=x; while(cur!=f) ss[++sn]=cur, cur=fa[cur]; while(sn) pd(ss[sn--]); while(fa[x]!=f) { int y=fa[x]; if(fa[y]!=f) { if(ch[fa[y]][1]==y^ch[y][1]==x) rot(x); else rot(y); } rot(x); } if(!f) root=x; } void splayp(int x,int f) { int p=root; pd(p); while(siz[ch[p][0]]!=x-1) { if(siz[ch[p][0]]<x-1) x-=siz[ch[p][0]]+1, p=ch[p][1]; else p=ch[p][0]; pd(p); } splay(p,f); } void addnode(int& x,int f,int v) { x=++an; ch[x][0]=ch[x][1]=rev[x]=0; fa[x]=f; siz[x]=1; vs[x]=v; } void build(int& x,int f,int l,int r) { if(l>r) {x=0; return;} int mid=l+r>>1; addnode(x,f,mid); build(ch[x][0],x,l,mid-1); build(ch[x][1],x,mid+1,r); upd(x); } #define RRL ch[ch[root][1]][0] void init() { addnode(root,0,0); addnode(ch[root][1],root,0); build(RRL,ch[root][1],1,n); upd(ch[root][1]); upd(root); } void revs(int l,int r) { splayp(l,0); splayp(r+2,root); rev[RRL]^=1; } int as[SZ],asn=0; void prt(int x) { if(!x) return; pd(x); prt(ch[x][0]); if(vs[x]) as[++asn]=vs[x]; prt(ch[x][1]); } int main() { scanf("%d%d",&n,&m); init(); for(int i=1;i<=m;i++) { int l,r; scanf("%d%d",&l,&r); revs(l,r); } asn=0; prt(root); for(int i=1;i<=n;i++) printf("%d ",as[i]); putchar(10); }
LCT uoj3
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; #define SZ 666666 int n,m,ch[SZ][2],vv[SZ],fa[SZ],root,an=0,mx[SZ]; bool rev[SZ]; void pd(int x) { if(!rev[x]) return; swap(ch[x][0],ch[x][1]); rev[ch[x][0]]^=1; rev[ch[x][1]]^=1; rev[x]=0; } bool top(int x) {return !(ch[fa[x]][0]==x||ch[fa[x]][1]==x);} void upd(int x) { mx[x]=x; if(vv[mx[ch[x][0]]]>vv[mx[x]]) mx[x]=mx[ch[x][0]]; if(vv[mx[ch[x][1]]]>vv[mx[x]]) mx[x]=mx[ch[x][1]]; } void rot(int x) { int y=fa[x],c=ch[y][0]==x; fa[x]=fa[y]; if(!top(y)) ch[fa[y]][ch[fa[y]][1]==y]=x; int h=ch[x][c]; ch[y][!c]=h; if(h) fa[h]=y; ch[x][c]=y; fa[y]=x; upd(y); upd(x); } int ss[SZ],sn=0; void splay(int x) { for(int c=x;;c=fa[c]) { ss[++sn]=c; if(top(c)) break; } while(sn) pd(ss[sn--]); while(!top(x)) { int y=fa[x]; if(!top(y)) { if(ch[fa[y]][1]==y^ch[y][1]==x) rot(x); else rot(y); } rot(x); } } void access(int x) { for(int c=0;x;c=x,x=fa[x]) splay(x), ch[x][1]=c, upd(x); } void makeroot(int x) {access(x); splay(x); rev[x]^=1;} void link(int a,int b) {makeroot(a); fa[a]=b;} void cut(int a,int b) {makeroot(a); access(b); splay(b); ch[b][0]=fa[a]=0;} int findroot(int x) { access(x); splay(x); while(ch[x][0]) x=ch[x][0]; splay(x); return x; } int getrd(int a,int b) {makeroot(a); access(b); splay(b); return b;} struct ce {int x,y,a,b;}es[233333]; bool operator < (ce a,ce b) {return a.a<b.a;} int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d%d",&es[i].x,&es[i].y,&es[i].a,&es[i].b); sort(es+1,es+1+m); int ans=2000000000; for(int i=1;i<=m;i++) { int x=es[i].x,y=es[i].y,b=es[i].b,a=es[i].a; vv[i+n]=b; if(findroot(x)==findroot(y)) { int p=mx[getrd(x,y)]; if(vv[p]<=b) goto updans; cut(p,es[p-n].x); cut(p,es[p-n].y); } link(x,i+n); link(y,i+n); updans: if(findroot(1)==findroot(n)) ans=min(ans,vv[mx[getrd(1,n)]]+a); } if(ans==2000000000) ans=-1; printf("%d ",ans); }
后缀自动机、序列自动机 bzoj4032
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; #define SZ 4444 #define S 27 struct AM { int ch[SZ][S],an,rot; }; struct SeqAM: public AM { int lst[S],fail[SZ]; SeqAM() { rot=an=1; for(int i=0;i<S;i++) lst[i]=1; } void ins(char c) { int x=++an; fail[x]=lst[c]; for(int i=0;i<S;i++) { for(int s=lst[i];s&&!ch[s][c];s=fail[s]) ch[s][c]=x; } lst[c]=x; } }SeqA,SeqB; struct SufAM: public AM { int ml[SZ],fail[SZ],lst,cl; SufAM() {lst=rot=an=1; cl=0;} void ins(char s) { int x=++an,len=++cl,p=lst; lst=x; ml[x]=len; for(;p&&!ch[p][s];p=fail[p]) ch[p][s]=x; if(!p) {fail[x]=rot; return;} if(ml[ch[p][s]]==ml[p]+1) fail[x]=ch[p][s]; else { int chh=ch[p][s],cm=++an; ml[cm]=ml[p]+1; fail[cm]=fail[chh]; for(int i=0;i<S;i++) ch[cm][i]=ch[chh][i]; fail[chh]=fail[x]=cm; for(;ch[p][s]==chh;p=fail[p]) ch[p][s]=cm; } } }SufA,SufB; int dep[SZ][SZ],qa[SZ*SZ],qb[SZ*SZ],h,t; int bfs(AM& a,AM& b) { memset(dep,0,sizeof(dep)); h=0; t=1; qa[0]=a.rot; qb[0]=b.rot; dep[a.rot][b.rot]=1; while(h!=t) { int ca=qa[h],cb=qb[h]; ++h; for(int i=0;i<S;i++) { int cah=a.ch[ca][i],cbh=b.ch[cb][i]; if(dep[cah][cbh]||!cah) continue; if(!cbh) return dep[ca][cb]; dep[cah][cbh]=dep[ca][cb]+1; qa[t]=cah; qb[t]=cbh; ++t; } } return -1; } #define prt(x) printf("%d ",x) char A[SZ],B[SZ]; int main() { scanf("%s%s",A,B); for(int i=0;A[i];i++) SeqA.ins(A[i]-'a'), SufA.ins(A[i]-'a'); for(int i=0;B[i];i++) SeqB.ins(B[i]-'a'), SufB.ins(B[i]-'a'); int AseqBseq=bfs(SeqA,SeqB); int AseqBsuf=bfs(SeqA,SufB); int AsufBseq=bfs(SufA,SeqB); int AsufBsuf=bfs(SufA,SufB); prt(AsufBsuf); prt(AsufBseq); prt(AseqBsuf); prt(AseqBseq); }
后缀数组 uoj35
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <string.h> #include <vector> #include <math.h> #include <limits> #include <set> #include <map> using namespace std; namespace gsa { #define SZ 666666 int n,sa[SZ],rank[SZ],qzh[SZ],t[SZ],tmpsa[SZ],tmpr[SZ],h[SZ]; char s[SZ]; bool same(int a,int b,int p) {return t[a]==t[b]&&t[a+p]==t[b+p];} void getsa(int n,int m=233) { for(int i=0;i<n;i++) rank[i]=s[i], ++qzh[rank[i]]; for(int i=1;i<m;i++) qzh[i]+=qzh[i-1]; for(int i=n-1;i>=0;i--) sa[--qzh[s[i]]]=i; for(int j=1;j<=n;j<<=1) { int cur=-1; for(int i=n-j;i<n;i++) tmpsa[++cur]=i; for(int i=0;i<n;i++) if(sa[i]>=j) tmpsa[++cur]=sa[i]-j; for(int i=0;i<n;i++) tmpr[i]=rank[tmpsa[i]]; for(int i=0;i<m;i++) qzh[i]=0; for(int i=0;i<n;i++) ++qzh[tmpr[i]]; for(int i=1;i<m;i++) qzh[i]+=qzh[i-1]; for(int i=n-1;i>=0;i--) t[i]=rank[i], sa[--qzh[tmpr[i]]]=tmpsa[i]; m=0; for(int i=0;i<n;i++) rank[sa[i]]=(i&&same(sa[i],sa[i-1],j))?m:++m; ++m; } for(int i=0;i<n;i++) rank[sa[i]]=i; } void geth(int n) { int p=0; for(int i=0;i<n;i++) { if(p) --p; int ls=sa[rank[i]-1]; while(s[ls+p]==s[i+p]) ++p; h[rank[i]]=p; } } void ma_in() { scanf("%s",s); n=strlen(s); getsa(n+1); geth(n); for(int i=1;i<=n;i++) printf("%d ",sa[i]+1); putchar(10); for(int i=2;i<=n;i++) printf("%d ",h[i]); } } int main() { gsa::ma_in(); }