题意:
s和t都是由字母a b c中的一种或两种字符 组成的长度为2的字符串
找到一个字符串 其中a b c三个字母各出现n次,并且s和t不是其连续子序列
(the strings “ab”, “ac” and “cc” are substrings of the string “abacc”, but the strings “bc”, “aa” and “cb” are not substrings of the string “abacc”.)
思路:
显然答案肯定存在
我们一定可以找到一个长度为3的字符串(这里把它叫做ans)使s和t都不是其子串(可以多举几组例子想想看)
然后分情况:
如果s中和t中的两个字符都不一样的话输出:
n个ans[1]+n个ans[2]+n个ans[3])
(↑↑↑这种情况的时候要保证s和t不是ans[1]ans[2]ans[3]ans[1]的子串,即要保证s和t与ans[3]ans[1]不同,例如:找ca cc的答案时,abc和bac都满足ca cc不是其连续子序列,但abcabc连续输出n次的话,会出现子连续子序列ca)
如果s和t中其中一个字符串中元素一样的话输出
(ans[1]+ans[2]+ans[3])*3
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,flag=0,z;
scanf("%lld",&n);
char s[5],t[5],i,j,k;
scanf("%s%s",s,t);
printf("YES\n");
if(s[0]!=s[1]&&t[0]!=t[1])
{
for(i='a'; i<='c'; i++)
{
for(j='a'; j<='c'; j++)
{
if(j==i)
continue;
for(k='a'; k<='c'; k++)
{
if(k==i||k==j)
continue;
if((s[0]==i&&s[1]==j)||(s[0]==j&&s[1]==k)||(t[0]==i&&t[1]==j)||(t[0]==j&&t[1]==k))
continue;
else
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
break;
}
for(z=1; z<=n; z++)
printf("%c",i);
for(z=1; z<=n; z++)
printf("%c",j);
for(z=1; z<=n; z++)
printf("%c",k);
printf("\n");
}
else
{
for(i='a'; i<='c'; i++)
{
for(j='a'; j<='c'; j++)
{
if(j==i)
continue;
for(k='a'; k<='c'; k++)
{
if(k==i||k==j)
continue;
if((s[0]==i&&s[1]==j)||(s[0]==j&&s[1]==k)||(s[0]==k&&s[1]==i)||(t[0]==i&&t[1]==j)||(t[0]==j&&t[1]==k)||(t[0]==k&&t[1]==i))
continue;
else
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
break;
}
for(z=1; z<=n; z++)
printf("%c%c%c",i,j,k);
printf("\n");
}
}