[Codeforces Round #657 (Div. 2)] A. Acacius and String

题目链接: 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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44235989/article/details/107665267