美文网首页
牛客练习赛53

牛客练习赛53

作者: 云中翻月 | 来源:发表于2019-10-12 22:14 被阅读0次

    比赛链接
    https://ac.nowcoder.com/acm/contest/1114#question
    题解链接
    https://ac.nowcoder.com/discuss/302786?type=101
    B
    代码如下

    
    

    C
    代码如下

    /*
    
    */
    #define method_1
    #ifdef method_1
    /*
    
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iomanip>
    #include<bitset>
    #include<ctime>
    #include<string>
    #define D(x) cout<<#x<<" = "<<x<<"  "
    #define E cout<<endl
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    const int maxn=1000+5;
    const int INF=0x3f3f3f3f;
    int n,m,Q;
    char s[maxn][maxn];
    char tmp[maxn];
    bitset<maxn>a[maxn],b,c,d;
    int main() {
    //  ios::sync_with_stdio(false);
        //freopen("富豪凯匹配串.in","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%s",s[i]);
            for(int j=0;j<m;j++) a[i][j]=s[i][j]-'0';
        }
        scanf("%d",&Q);
        while(Q--){
            scanf("%s",tmp);
            for(int i=0;i<m;i++){
                b[i]=tmp[i]=='_'?0:tmp[i]-'0';
                c[i]=tmp[i]=='_'?1:0;
            }
    //      D(b);D(c);E;
            int ans=0;
            for(int i=1;i<=n;i++){
                d=a[i]^b; //将a[i]中所有下划线对应的位置原封不动的提取出来,其他位置置为0。如果有非下划线位置与询问串有不同,对应位置也会置为1. 
                if((d&c)==d) ans++; //d&c表示将所有下划线对应位置都提取出来,其他位置置为0。(d&c)==d表示除了下划线对应位置,其他位置都相同。 
            }
            printf("%d\n",ans);
        }
        return 0;
    }
    #endif
    #ifdef method_2
    /*
    
    */
    
    #endif
    #ifdef method_3
    /*
    
    */
    
    #endif
    

    D
    代码如下

    /*
    
    */
    #define method_1
    #ifdef method_1
    /*
    
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iomanip>
    #include<ctime>
    #include<string>
    #define D(x) cout<<#x<<" = "<<x<<"  "
    #define E cout<<endl
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    const int maxN=500000+5;
    const int maxn=200+5;
    const int maxL=2000000+5;
    const int maxl=6+5;
    const int maxm=84*84*2+5;
    const int maxv=999999+5;
    const int maxV=9+5;
    const int INF=0x3f3f3f3f;
    int n,Q;
    char str[maxl],tmp[maxL];
    struct node{
        int from,to,cap;
    }edge[maxm];
    int head[maxn],tot,d[maxn],s,t;
    int maxflow;
    int cnt=0;
    int vis[maxv],num[maxn],g[maxn][maxl],c[maxV];
    void init(){
        memset(head,0,sizeof(head));
        tot=1;
        memset(c,0,sizeof(c));
    }
    int calc(){
        int res=0;
        for(int i=0;i<6;i++){
            res=res*10+str[i]-'0';
        }
        return res;
    }
    void add(int from,int to,int cap){
        edge[++tot].from=head[from],head[from]=tot,edge[tot].to=to,edge[tot].cap=cap;
        edge[++tot].from=head[to],head[to]=tot,edge[tot].to=from,edge[tot].cap=0;
    }
    queue<int>q;
    bool bfs(){
        memset(d,0,sizeof(d));
        while(q.size()) q.pop();
        q.push(s);d[s]=1;
        while(q.size()){
            int x=q.front();q.pop();
            for(int i=head[x];i;i=edge[i].from){
                int y=edge[i].to,cap=edge[i].cap;
                if(cap&&!d[y]){
                    d[y]=d[x]+1;
                    q.push(y);
                    if(y==t) return 1;
                }
            }
        }
        return 0;
    }
    int dinic(int x,int flow){ 
        if(x==t) return flow;
        int rest=flow,k;
        for(int i=head[x];i&&rest;i=edge[i].from){
            int y=edge[i].to;
            if(edge[i].cap&&d[y]==d[x]+1){
                k=dinic(y,min(rest,edge[i].cap));
                if(!k) d[y]=0;
                edge[i].cap-=k;
                edge[i^1].cap+=k;
                rest-=k;
            }
        }
        return flow-rest;
    }
    int main() {
        ios::sync_with_stdio(false);
        //freopen("德育分博弈政治课.in","r",stdin);
        scanf("%d%d",&n,&Q);
        for(int i=1;i<=n;i++){
            scanf("%s",str);
            sort(str,str+6);
            int val=calc();
            if(!vis[val]){
                vis[val]=++cnt;
                int temp=val;
                for(int j=0;j<6;j++){
                    g[cnt][j]=temp%10;
                    temp/=10;
                }
            }   
            num[vis[val]]++;
        }
        s=0,t=cnt+9+1;
        while(Q--){
            init();
            scanf("%s",tmp);
            int len=strlen(tmp);
            for(int i=0;i<len;i++){ //用char字符串 一定要先算出长度 不要一直将strlen带着走 否则耗时将特别长 
                c[tmp[i]-'0']++;
            }
            for(int i=1;i<=cnt;i++){
                add(s,i,num[i]);
                for(int j=0;j<6;j++) add(i,g[i][j]+cnt,INF);
            }
            for(int i=1;i<=9;i++){
                add(cnt+i,t,c[i]);
            }
            maxflow=0;
            int flow=0;
            while(bfs()){
                while(flow=dinic(s,INF)) maxflow+=flow;
            }
    //      D(maxflow);E;
            if(maxflow==len) printf("dyf\n");
            else printf("zzk\n");
        }
        return 0;
    }
    #endif
    #ifdef method_2
    /*
    
    */
    
    #endif
    #ifdef method_3
    /*
    
    */
    
    #endif
    

    E
    代码如下

    /*
    
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    #include<iomanip>
    #include<ctime>
    #include<string>
    #define D(x) cout<<#x<<" = "<<x<<"  "
    #define E cout<<endl
    using namespace std;
    typedef long long ll;
    typedef pair<int,int>pii;
    const int maxn=500000+5;
    const int maxnum=1000000+5;
    const int INF=0x3f3f3f3f;
    int n,Q,a[maxn],pos[maxnum],d[maxn]; //d[i]表示a[i]左边第一个与它相同的数字的下标 
    int ans[maxn];
    struct node{
        int L,R,id;
        bool operator<(const node& h)const{return R<h.R;}
    }q[maxn];
    struct SegmentTree{
        int l,r,dat;
    }tr[maxn<<2];
    void init(){
        memset(pos,-1,sizeof(pos));
    }
    void build(int rt,int l,int r){
        tr[rt].l=l,tr[rt].r=r;
        if(l==r){
            tr[rt].dat=INF;
            return;
        }
        int mid=l+r>>1;
        build(rt<<1,l,mid);
        build(rt<<1|1,mid+1,r);
        tr[rt].dat=min(tr[rt<<1].dat,tr[rt<<1|1].dat);
    }
    void update(int rt,int x,int v){
        if(tr[rt].l==tr[rt].r){
            tr[rt].dat=min(tr[rt].dat,v);
            return;
        }
        int mid=tr[rt].l+tr[rt].r>>1;
        if(x<=mid) update(rt<<1,x,v);
        else update(rt<<1|1,x,v);
        tr[rt].dat=min(tr[rt<<1].dat,tr[rt<<1|1].dat);
    }
    int query(int rt,int l,int r){
        if(tr[rt].l>=l&&tr[rt].r<=r) return tr[rt].dat;
        int val=INF;
        int mid=tr[rt].l+tr[rt].r>>1;
        if(l<=mid) val=min(val,query(rt<<1,l,r));
        if(mid<r) val=min(val,query(rt<<1|1,l,r));
        return val;
    }
    int main() {
    //  ios::sync_with_stdio(false);
        //freopen("老瞎眼 pk 小鲜肉.in","r",stdin);
        init();
        scanf("%d%d",&n,&Q);    
        pos[0]=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            a[i]^=a[i-1];
            if(pos[a[i]]==-1) d[i]=-1;
            else d[i]=pos[a[i]]+1;
            pos[a[i]]=i;
    //      D(pos[a[i]]);D(d[i]);E;
        }
        for(int i=1;i<=Q;i++){
            scanf("%d%d",&q[i].L,&q[i].R);  
            q[i].id=i;
        }   
        sort(q+1,q+Q+1);
        build(1,1,n);
        int cnt=1;
        for(int i=1;i<=n;i++){
            if(d[i]!=-1) update(1,d[i],i-d[i]+1);
            while(q[cnt].R==i){
                ans[q[cnt].id]=query(1,q[cnt].L,q[cnt].R);
                cnt++;
            }
        }
        for(int i=1;i<=Q;i++){
            if(ans[i]==INF) printf("-1\n");
            else printf("%d\n",ans[i]);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:牛客练习赛53

          本文链接:https://www.haomeiwen.com/subject/pbjcmctx.html