题目链接: A. Acacius and String
题意
给你一个含有小写字母和“ ?”的字符串," ? "可以用任何字母代替,问是否可以用小写英文字母替换所有问号,这样字符串“ abacaba ”作为结果字符串中的子字符串恰好出现一次。
题解
本题中只出现一次是关键点,很可能出现字符串中已有“abacaba”,我们无需再将“ ?”代替为“abacaba”中的一个。所以我们像尺取一样,每读取7个字符,判断是否为“abacaba”或者可以变为“abacaba”,如果是则将其变为“abacaba”,然后其它的“ ?”用另外的字符替代,判断整个字符串的“abacaba”个数是否为1,是则输出;否则继续尺取读入。
代码
int main()
{
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s;
cin >> s;
int sorry=0;
for(int i=0;i+7<=s.length();i++)
{
int cnt=0;
string t=s.substr(i,7);
int ok=1;
for(int j=0;j<7;j++)
{
ok = ok && (t[j]=='?' || t[j]=="abacaba"[j]);
}
if(ok)
{
string ss=s;
for(int j=0;j<7;j++) ss[i+j]="abacaba"[j];
for(int j=0;j<=ss.length();j++)
{
if(ss[j]=='?') ss[j]='x';
}
for(int k=0;k+7<=ss.length();k++)
{
string t = ss.substr(k,7);
if(t=="abacaba") cnt++;
}
if(cnt==1)
{
cout << "Yes\n" << ss << endl;
sorry=1;
break;
}
}
}
if(!sorry) cout << "No" << endl;
}
}