Codeforces 1213E Two Small Strings

cf題面數組

中文題意

給個n,再給兩個長度爲2的字符串,要求構造一個長度爲\(3n\)的字符串,a、b、c三個字母各n個,且構造出的字符串子串中不能出現給定的兩個字符串。若是不存在這樣的字符串,就輸出NO函數

解題思路

首先生成a、b、c的6個全排列,而後,每種全排列以兩種方式擴大n倍——舉個例子,n爲3時,對於acb,能夠擴展成這兩種:acbacbacbaaacccbbb。而後依次檢查這12種字符串是否有知足要求的,有就輸出,沒有就表明沒有了(能夠考慮字符串排列的內部以及擴展後字符串之間的邊界)spa

(虛擬賽時想到第一種擴展方式,把本身卡了之後,想到第二種,又把本身卡了,愣是想不到兩種都試試……).net

源代碼

#include<cstdio>
#include<stdlib.h>
#include<algorithm>
const int MAXN=3e5+5;
int n;
char mo[6][4]={"abc","acb","bac","bca","cab","cba"};
char input[2][3];
char s[MAXN];
void check()
{
   for(int i=2;i<=n*3;i++)
   {
       if(s[i]==input[0][1]&&s[i-1]==input[0][0]||s[i]==input[1][1]&&s[i-1]==input[1][0]) return;
   }
   printf("YES\n%s",s+1);
   exit(0);
}
int main()
{
    scanf("%d%s%s",&n,input[0],input[1]);
    for(int m=0;m<6;m++)
    {
        for(int i=1;i<=n;i++)//而後一個奇怪的地方,我以前提交的時候input數組開到[2][2],輸入時顯然溢出了,可是輸入那裏不報錯,反而這個循環不會進入,就是i這個循環。m那個循環進來了,而後直接進入check函數。爲何嘞……留坑
        {
            s[(i-1)*3+1]=mo[m][0];
            s[(i-1)*3+2]=mo[m][1];
            s[(i-1)*3+3]=mo[m][2];
        }
        check();
        for(int i=1;i<=n;i++)
        {
            s[i]=mo[m][0];
            s[i+n]=mo[m][1];
            s[i+n+n]=mo[m][2];
        }
        check();
    }
    puts("NO");
    return 0;
}

本博客第一篇被打上構造標籤的博文(真該打個標籤叫智商code

相關文章
相關標籤/搜索