Codeforces Round #657 (Div. 2)

A. Acacius and String

题意:?可以替换成任意字母,问能否让字符串中出现且仅出现一次abacaba

。。。比较笨就打算写模拟了

先找有没有原来有的标准串,如果有且数量大于1个的,不合法

              有一个的,将?改为z,输出

              没有,找能否操作让标准串出现且仅出现一次。

                    若有,输出。若无,不合法。

string s,a,str="abacaba";
int n,t;
int judge(int x){
    string nn=s;
    int pos=0,cnt=0;
    for(int i=x;i<=x+6;++i,++pos)    nn[i]=str[pos];
    for(int i=0;i<n-6;++i){
        a=nn.substr(i,7);
        if(a==str)    cnt++;
    }
    if(cnt==1)    return 1;
    else        return 0;
}
int main(){
    scanf("%d",&t);
    while(t--){
        int cnt=0;
        scanf("%d",&n);
        cin>>s;
        for(int i=0;i<n-6;++i){
            a=s.substr(i,7);
            if(a==str)    cnt++;
        }
        if(cnt>1){
            printf("No
");
        }
        else if(cnt==1){
            printf("YES
");
            for(int i=0;i<n;++i){
                if(s[i]=='?')    printf("z");
                else    printf("%c",s[i]);
            }
            printf("
");
        }
        else{
            int ff=0,p; 
            for(int i=0;i<n-6;++i){
                int flag=1,pos=0;
                for(int j=i;j<=i+6;++j,++pos){
                    if(s[j]=='?')    continue;
                    else if(s[j]!=str[pos]){
                        flag=0;break;
                    }
                }
                if(flag){
                    if(judge(i)){
                        ff=1;p=i;
                        break;
                    }
                }
            }
            if(!ff){
                printf("No
");
            }
            else{
                printf("YES
");
                for(int i=0;i<n;++i){
                    if(i!=p){
                        if(s[i]=='?')    printf("z");
                        else    printf("%c",s[i]);
                    }
                    else{
                        cout<<str;
                        i+=6;
                    }
                }
                printf("
");
            }
        }
    }
    return 0;
}

 B. Dubious Cyrpto

题意:l≤a,b,c≤r  m=n*a+b-c,给定任意l,r,m,求n为正整数情况下abc的值

由于abc的值都在1e5内,所以只能枚举a

b-c看成余数,n看成方程解。

这样做会出现一个问题,取余后b-c的值一定为正,但是n可能为0。

此时就需要我们在b-c里手动减去一个a

由于b、c范围内即可,所以依托l和r构造一下

ll t,l,r,m,n,x;
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld%lld",&l,&r,&m);
        for(int a=l;a<=r;++a){
            n=m/a;
            x=m%a;
            if(n>0&&x<=r-l&&x>=l-r){
                cout<<a<<" "<<l+x<<" "<<l<<endl;
                break;
            }
            else{
                x-=a;
                if(x>=l-r){
                    cout<<a<<" "<<r+x<<" "<<r<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/PdrEam/p/13946053.html