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; }