[CF1213E] Two Small Strings

给定两个长度为 (2) 的串,你需要构造一个长度为 (3n) 的串,使得 a,b,c 三种字母各出现 (n) 次,且它不包含这两个串,字符集中仅有 a,b,c

Solution

画出转移图,(3) 个点,(7) 条边,可能不连通

但是很容易证明以下构造模式集可以对所有有解的情况给出合法的构造

(以 (n=2) 为例)

aabbcc
aaccbb
bbaacc
bbccaa
ccaabb
ccbbaa
abcabc
acbacb
bcabca
bacbac
cabcab
cbacba

于是我们用每种模式构造一个串,检验是否合法即可

#include <bits/stdc++.h>
using namespace std;

int n;
string a,b,s;

void calc1(char x,char y,char z) {
    s.clear();
    s.append(n,x);
    s.append(n,y);
    s.append(n,z);
}

void calc2(char x,char y,char z) {
    s.clear();
    for(int i=1;i<=n;i++) s+=x,s+=y,s+=z;
}

void ok() {
    if(s.find(a)==s.npos && s.find(b)==s.npos) {
        cout<<"YES"<<endl<<s;
        exit(0);
    }
}

char p[3];

signed main() {
    cin>>n>>a>>b;
    iota(p,p+3,'a');
    do {calc1(p[0],p[1],p[2]);ok();} while(next_permutation(p,p+3));
    do {calc2(p[0],p[1],p[2]);ok();} while(next_permutation(p,p+3));
    cout<<"NO";
}

原文地址:https://www.cnblogs.com/mollnn/p/12620809.html