返回顶部

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;
    }
    
posted @ 2020-11-26 22:33  Rayotaku  阅读(59)  评论(0编辑  收藏  举报