这次得CF真的让人自闭。。。。这题不错,很考验代码能力,利用sbustr截取字符串经行比较可以大大减小代码量。具体思路就是暴力做法,枚举给定字符串得起始位置看包括‘?’在内能否与‘abacaba’匹配,如果可以,再从开始位置检查子串的’abacaba‘是否唯一。参考了大佬的代码,STL函数一用是真的短,ORZ。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
string p="abacaba";
int main() {
int t;
cin>>t;
while(t--) {
int n;
string s,ans;
cin>>n>>s;
for(int i=0; i<=n-7; i++) {
int flag=1;
string ss=s;
for(int j=0; j<7; j++)
if(ss[i+j]!=p[j]&&ss[i+j]!='?')flag=0;
else ss[i+j]=p[j];
if(!flag)continue;
for(int j=0; j<=n; j++)if(ss[j]=='?')ss[j]='z';
for(int j=0; j<=n-7; j++)if(j!=i&&ss.substr(j,7)==p)flag=0;
if(flag) {
ans=ss;
break;
}
}
if(ans.empty())cout<<"No"<<endl;
else cout<<"Yes"<<endl<<ans<<endl;
}
}