Codeforces 1213E二つの小さな文字列

CF質問表面

中文题意

Nを与える、長さ2の2つの文字列を与える、構成の長さが必要(3N \付き)\の三の文字Nの各々 、及び構築ストリングストリングのC列A、B、二つの文字列与えられたように見えることはできません。この文字列が存在しない場合は、出力NO

問題解決のためのアイデア

第6のフル配列C、Bを生成し、各完全な配列は、2つの方法でn倍に拡大-例えば、nがある場合〜3。acb両方に拡張します:acbacbacbaaacccbbbが出力され、文字列が要件を満たす必要があるかどうか、これらの12のチェックをその後、無それには(内部文字列の配置を考慮しないとすることができる拡張文字列の境界)を表します

(......自分自身試みることを考えて唖然としているどちらもカード、取得、考え直した後、自分のカードを入れて、仮想レースに拡大するための最初の方法を考えます)

ソース

#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;
}

このブログの最初の記事がでマークされ构造(実際に呼ばれるラベルを作成するラベルのブログ智商

おすすめ

転載: www.cnblogs.com/wawcac-blog/p/11464774.html