Codeforces Round #582 (Div. 3) E. Two Small Strings (构造,思维,全排列)
-
题意:给你两个长度为\(2\)的字符串\(s\)和\(t\),你需要构造一个长度为\(3n\)的字符串,满足:含有\(n\)个\(a\),\(n\)个\(b\),\(n\)个\(c\),并且\(s\)和\(t\)不能是它的子串.
-
题解:首先,假如所给的长度为\(2\)的字符串两两不相等,那么我们一定可以构造一个类似\(aaaabbbbcccc\)这样的相等且连续的合法字符串,而如果两个字符是相等的,那么满足条件的字符串一定可以是,由\(abc\)的全排列的某一种情况复制\(3\)个拼接得到的,所以我们就可以用next_permutation来求出\(abc\)的全排列\(c_1c_2c_3\),然后将\(c_1c_2c_3c_1c_2c_3...c_1c_2c_3\)和\(c_1c_1c_1...c_2c_2c_2...c_3c_3c_3...c_3\)存到vector中去,最后枚举它们,判断\(s\)和\(t\)是不是它们的子串即可.
-
代码:
int n; string s,t; vector<string> v; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n; cin>>s>>t; string str="abc"; do{ string cur; rep(i,1,n) cur+=str; v.pb(cur); v.pb(string(n,str[0])+string(n,str[1])+string(n,str[2])); }while(next_permutation(str.begin(),str.end())); for(auto w : v){ if(w.find(s) == string::npos && w.find(t) == string::npos){ cout<<"YES\n"; cout<<w<<'\n'; return 0; } } cout<<"NO\n"; return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮