美文网首页
牛客练习赛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