您的当前位置:首页正文

想法-Codeforces-1213F Two Small Strings

2024-11-09 来源:个人技术集锦


题意:
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");
    }
}

Top