CF1213E Two Small Strings 細節

球王武磊發表於2020-11-18

CF1213E Two Small Strings
簡單的字串構造題,但是要注意細節。

ACM周賽的時候,WA on test 4,WA on test 10,WA on test 20…最後幾分鐘好不容易才A了。還是要更加註意考慮一些細節。

因為只要輸出任意一種符合情況的答案,我們只用考慮兩種不同的方案,就能夠解決所有的情況。一種是形如“abcabcabc”,字母按照週期輸出;一種是形如“aaabbbccc”,每個字母連續輸出。

對於這道題,難度並不是很大,直接列舉所有情況即可,找到一種符合要求的方案。對於第一種方案,如果輸入的n大於1時,我們需要判斷週期末尾的字母是否可以接週期開頭的字母;對於第二種方案,如果輸入的n大於1時,我們需要注意是否允許連續出現同一種字母,若輸入的兩個限制的字串當中有連續的,則只能採取第一種方案。

AC程式碼:

#include <cstdio>
int main()
{
	int n;
	char r[3],s[2],t[2];
	scanf("%d",&n);
	scanf("%s",s);
	scanf("%s",t);
	int flag=0,cons=0;
	if(s[0]==s[1]||t[0]==t[1])
	{
		cons=0;
		for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		for(int k=0;k<3;k++)
		{
			r[0]='a'+i;
			r[1]='a'+j;
			r[2]='a'+k;
			if(r[0]==r[1]||r[0]==r[2]||r[1]==r[2])
				continue;
			if(r[0]==s[0]&&r[1]==s[1]||r[1]==s[0]&&r[2]==s[1]||r[2]==s[0]&&r[0]==s[1]
			 ||r[0]==t[0]&&r[1]==t[1]||r[1]==t[0]&&r[2]==t[1]||r[2]==t[0]&&r[0]==t[1])
				continue;
			flag=1;
			goto label;
		}
	}
	else
	{
		cons=1;
		for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		for(int k=0;k<3;k++)
		{
			r[0]='a'+i;
			r[1]='a'+j;
			r[2]='a'+k;
			if(r[0]==r[1]||r[0]==r[2]||r[1]==r[2])
				continue;
			if(r[0]==s[0]&&r[1]==s[1]||r[1]==s[0]&&r[2]==s[1]
			 ||r[0]==t[0]&&r[1]==t[1]||r[1]==t[0]&&r[2]==t[1])
				continue;
			flag=1;
			goto label;
		}
	}
	label:
	if(flag==0)
		printf("NO\n");
	else
	{
		printf("YES\n");
		if(cons==0)
			for(int t=0;t<n;t++)
			for(int i=0;i<3;i++)
				printf("%c",r[i]);
		else
			for(int i=0;i<3;i++)
			for(int t=0;t<n;t++)
				printf("%c",r[i]);
		printf("\n");
	}
	return 0;
}

相關文章