模板仓库

梦想与她 提交于 2019-12-04 03:37:39

字符串类

后缀数组

#include<bits/stdc++.h>
using namespace std;

#define maxn 1000007

void read(int &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') fh=-1,ch=getchar();
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

char s[maxn];
int n,m,sa[maxn],x[maxn],y[maxn],ct[maxn];

void SA(){
    for(register int i=1;i<=n;i++) ct[x[i]=s[i]]++;
    for(register int i=2;i<=m;i++) ct[i]+=ct[i-1];
    for(register int i=n;i>=1;i--) sa[ct[x[i]]--]=i;
    for(register int k=1;k<=n;k<<=1){
        int tot=0;
        for(register int i=n-k+1;i<=n;i++) y[++tot]=i;
        for(register int i=1;i<=n;i++) if(sa[i]>k) y[++tot]=sa[i]-k;
        for(register int i=1;i<=m;i++) ct[i]=0;
        for(register int i=1;i<=n;i++) ct[x[i]]++;
        for(register int i=1;i<=m;i++) ct[i]+=ct[i-1];
        for(register int i=n;i>=1;i--) sa[ct[x[y[i]]]--]=y[i],y[i]=0;
        swap(x,y);x[sa[1]]=tot=1;
        for(register int i=2;i<=n;i++)
            if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]) x[sa[i]]=tot;
            else x[sa[i]]=++tot;
        if(tot==n) break;
        m=tot;
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin>>(s+1);n=strlen(s+1);
    m=122;SA();
    for(register int i=1;i<n;i++) printf("%d ",sa[i]);
    printf("%d\n",sa[n]);
    return 0;
}

manacher

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){
        fh=-1;ch=getchar();
    }
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

int n,opt[22000003];
char s[22000003];

int rgt,mid,ans;

void Init(){
    s[0]='~';s[++n]='|';char c=1;
    while(c<'a'||c>'z') c=getchar();
    while(c>='a'&&c<='z'){
        s[++n]=c,s[++n]='|';
        c=getchar(); 
    }
}

int main(){
    Init();
    for(int i=1;i<=n;i++){
        if(i<rgt){
            opt[i]=min(opt[(mid<<1)-i],rgt-i);
        }
        else opt[i]=1;
        while(s[i-opt[i]]==s[i+opt[i]]) opt[i]++;
        if(opt[i]+i>rgt) rgt=opt[i]+i,mid=i;
        ans=max(ans,opt[i]);
    }
    --ans;
//  if(ans==-1) ans++;
    printf("%d\n",ans);
    return 0;
}

数据结构类

include<bits/stdc++.h>

using namespace std;

define maxn 2000007

int n,opt,x,t[maxn],tot;
void pushup(int k){
int s=k;int p=s>>1;
if(!p) return;
while(p&&t[p]>t[s]){
swap(t[p],t[s]);
s=p;p=s>>1;
}
}
void pushdown(int k){
int s=k;int p=s<<1;
while(p<=tot){
//if(t[s]<t[p]) break;

    if(p<tot&&t[p]>t[p+1]) p+=1;
    if(t[s]<t[p]) break;
    swap(t[s],t[p]);
    s=p;p=s<<1;
}

}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d",&opt);
if(opt==1){
scanf("%d",&x);
t[++tot]=x;
pushup(tot);
}
if(opt==2) printf("%d\n",t[1]);
if(opt==3){
t[1]=t[tot--];
pushdown(1);
}
}
}
```
---

ST表

#include<bits/stdc++.h>
using namespace std;

#define maxn 100005

int n,q;
int a[maxn];
int opt[maxn][32],x,y;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){
        fh=-1;ch=getchar();
    }
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

void jup(){
    for(register int i=1;i<=21;i++){
        for(register int j=1;j+(1<<i)-1<=n;j++){
            opt[j][i]=max(opt[j][i-1],opt[j+(1<<(i-1))][i-1]);
        }
    }
}
int query(){
    int k=log2(y-x+1);
    return max(opt[x][k],opt[y-(1<<k)+1][k]);
}
int main(){
    read(n);read(q);
    for(register int i=1;i<=n;i++){
        read(a[i]);opt[i][0]=a[i];
    }
    jup();
    while(q--){
        read(x);read(y);
        printf("%d\n",query());
    }
    return 0;
}

动态DP

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=100007;
const int maxm=200007;

int n,T;
int a[maxn];

int fa[maxn],dep[maxn],size[maxn];
int son[maxn];

int Head[maxn],to[maxm],Next[maxm];
int tot=1;

void add(int x,int y){
    to[++tot]=y,Next[tot]=Head[x],Head[x]=tot;
}


struct Matrix{
    int mat[2][2];
    Matrix(){
        memset(mat,0xcf,sizeof(mat));
    }
    Matrix operator *(Matrix b){
        Matrix c;
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                for(int k=0;k<2;k++)
                    c.mat[i][j]=max(c.mat[i][j],mat[i][k]+b.mat[k][j]);
        return c;
    }
};

int f[maxn][2];
Matrix val[maxn];

void dfs1(int x,int f,int dp){
    fa[x]=f,size[x]=1,dep[x]=dp;
    int mx=-1;
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(y==f) continue;
        dfs1(y,x,dp+1);size[x]+=size[y];
        if(size[y]>mx) mx=size[y],son[x]=y;
    }
}

int New[maxn],pre[maxn],ind;
int ed[maxn],top[maxn];


void dfs2(int x,int tp){
    New[x]=++ind,pre[ind]=x,top[x]=tp;
    ed[tp]=max(ed[tp],ind);
    
    f[x][0]=0,f[x][1]=a[x];
    val[x].mat[0][0]=val[x].mat[0][1]=0;
    val[x].mat[1][0]=a[x];
    
    if(!son[x]) return;
    dfs2(son[x],tp);
    f[x][0]+=max(f[son[x]][0],f[son[x]][1]);
    f[x][1]+=f[son[x]][0];
    
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(y==fa[x]||y==son[x]) continue;
        dfs2(y,y);
        
        f[x][0]+=max(f[y][0],f[y][1]);
        f[x][1]+=f[y][0];
        val[x].mat[0][0]+=max(f[y][0],f[y][1]);
        val[x].mat[0][1]=val[x].mat[0][0];
        val[x].mat[1][0]+=f[y][0];
    }
}

#define lfc (x<<1)
#define rgc ((x<<1)|1)
#define mid ((l+r)>>1)

Matrix m[maxn<<2];

void pushup(int x){
    m[x]=m[lfc]*m[rgc];
}

void build(int x,int l,int r){
    if(l==r){
        m[x]=val[pre[l]];
        return;
    }
    build(lfc,l,mid);build(rgc,mid+1,r);
    pushup(x);
}

int L,R;
Matrix need;

void change(int x,int l,int r){
    if(l==r){
        m[x]=need;
        return;
    }
    if(L<=mid) change(lfc,l,mid);
    else change(rgc,mid+1,r);
    pushup(x);
}

Matrix query(int x,int l,int r,int L,int R){
    if(l==L&&r==R) return m[x];
    if(R<=mid) return query(lfc,l,mid,L,R);
    else if(L>mid) return query(rgc,mid+1,r,L,R);
    return query(lfc,l,mid,L,mid)*query(rgc,mid+1,r,mid+1,R);
}

void update(int x,int w){
    val[x].mat[1][0]+=w-a[x];
    a[x]=w;
    
    Matrix bef,aft;
    while(x){
        L=New[top[x]],R=ed[top[x]];
        bef=query(1,1,n,L,R);
        
        L=New[x],need=val[x];
        change(1,1,n);
        
        L=New[top[x]],R=ed[top[x]];
        aft=query(1,1,n,L,R);
        
        x=fa[top[x]];
        
        val[x].mat[0][0]+=max(aft.mat[0][0],aft.mat[1][0])-max(bef.mat[0][0],bef.mat[1][0]);
        val[x].mat[0][1]=val[x].mat[0][0];
        val[x].mat[1][0]+=aft.mat[0][0]-bef.mat[0][0];
    }
}

int main(){
    read(n);read(T);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int x,y,i=1;i<n;i++){
        read(x);read(y);
        add(x,y);add(y,x);
    }
    dfs1(1,0,1);dfs2(1,1);
    build(1,1,n);
    for(int x,y,i=1;i<=T;i++){
        read(x);read(y);
        update(x,y);
        L=New[1],R=ed[1];
        Matrix ans=query(1,1,n,L,R);
        printf("%d\n",max(ans.mat[0][0],ans.mat[1][0]));
    }
    return 0;
}

图论类

负环

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;

#define maxn 2007
#define maxm 6007

int T;
int n,m;
int Head[maxn],Next[maxm],to[maxm],tot,w[maxm];

void add(int x,int y,int z){
    to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
}

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){
        fh=-1;ch=getchar();
    }
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

bitset<maxn>inq;
int dis[maxn];
int cnt[maxn];
bool spfa(int s){
    memset(dis,0x3f,sizeof(dis));
    queue<int>q;inq[s]=1;
    q.push(s);cnt[s]=1;dis[s]=0;
    while(!q.empty()){
        int x=q.front();inq[x]=0;q.pop();
        for(int i=Head[x];i;i=Next[i]){
            if(dis[x]+w[i]<dis[to[i]]){
                dis[to[i]]=dis[x]+w[i];
                cnt[to[i]]++;
                if(cnt[to[i]]>n) return 1;
                if(inq[to[i]]) continue;
                q.push(to[i]);inq[to[i]]=1;
            }
        }
    }
    return 0;
}
void Reset(){
    inq.reset();memset(cnt,0,sizeof(cnt));tot=0;
    memset(Head,0,sizeof(Head));memset(Next,0,sizeof(Next));
}
int main(){
    read(T);int xx,yy,zz;
    while(T--){
        read(n);read(m);
        Reset();
        for(register int i=1;i<=m;i++){
            read(xx);read(yy);read(zz);
            if(zz>=0) add(xx,yy,zz),add(yy,xx,zz);
            else add(xx,yy,zz);
        }
        if(spfa(1)){
            puts("YE5");
        }
        else puts("N0");
    }
    return 0;
}

缩点

#include<bits/stdc++.h>

using namespace std;

#define maxn 10003
#define maxm 100003

int n,m,wy[maxn],wn[maxn],x,y;
int dfn[maxn],low[maxn],st[maxn],top,ind,cnt,id[maxn];
bool ins[maxn];
int vy[maxm],vn[maxm],toty,totn,Headn[maxn],Heady[maxn],Nexty[maxm],Nextn[maxm];
struct node{
    int x,y;
    bool operator <(node a)const{
        return a.x==x?a.y<y:a.x<x;
    }
};
set <node> s;
int rd[maxn],tp[maxn],tql,fr=1,opt[maxn];
int ans;

template<typename Tp>
void read(Tp &x){
    x=0;char ch=0;int fh;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-'){
        ch=getchar();fh=-1;
    }
    else fh=1;
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    x*=fh;
}

void tarjan(int x){
    dfn[x]=low[x]=++ind;st[++top]=x;ins[x]=1;
    for(int i=Heady[x];i;i=Nexty[i]){
        if(dfn[vy[i]]){
            if(ins[vy[i]]){
                low[x]=min(low[x],dfn[vy[i]]);
            }
        }
        else{
            tarjan(vy[i]);
            low[x]=min(low[x],low[vy[i]]);
        }
    }
    if(low[x]==dfn[x]){
        ++cnt;
        while(st[top]!=x){
            id[st[top]]=cnt;ins[st[top--]]=0;
        }
        id[st[top--]]=cnt;ins[x]=0;
    }
}

int main(){
    read(n);read(m);
    for(int i=1;i<=n;i++){
        read(wy[i]);
    }
    for(int i=1;i<=m;i++){
        read(x);read(y);
        vy[++toty]=y,Nexty[toty]=Heady[x],Heady[x]=toty;
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]) tarjan(i);
    }
    for(int i=1;i<=n;i++){
        for(int j=Heady[i];j;j=Nexty[j]){
            if(id[i]==id[vy[j]]) continue;
//          if(s.count((node){id[i],id[vy[j]]})) continue;
//          s.insert((node){id[i],id[vy[j]]});
            vn[++totn]=id[vy[j]],Nextn[totn]=Headn[id[i]],Headn[id[i]]=totn;
            rd[id[vy[j]]]++;
        }
        wn[id[i]]+=wy[i];
    }
    for(int i=1;i<=cnt;i++){
        if(!rd[i]){
            tp[++tql]=i;
        }
        opt[i]=wn[i];
    }
    while(fr<=tql){
        int k=tp[fr++];
        for(int i=Headn[k];i;i=Nextn[i]){
            rd[vn[i]]--;
            if(!rd[vn[i]]) tp[++tql]=vn[i];
            opt[vn[i]]=max(opt[vn[i]],opt[k]+wn[vn[i]]);
        }
    }
    for(register int i=1;i<=cnt;i++){
        ans=max(ans,opt[i]);
    }
    printf("%d\n",ans);
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!