模板综合

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\n",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\n",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\n",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\n",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();
}
posted @ 2016-05-01 20:49  fjzzq2002  阅读(399)  评论(0编辑  收藏  举报