zoukankan      html  css  js  c++  java
  • CF1213E Two Small Strings

    题目链接

    问题分析

    由于三个字母是等价的,所以大致可以分为如下几种情况:

    • aa, ab

    • ab, ac

    • ab, ba

    • ab, bc

    不难发现,第(3)中情况可能造成无解((n>1)时),而剩下的情况都可以由(aaabbbccc)(abcabcabc)这样的串解决。所以直接枚举(3)个字母的全排列,然后拓展成上面两种情况分别判断一下即可。

    参考程序

    #include <bits/stdc++.h>
    using namespace std;
    
    int n;
    char A[ 10 ], B[ 10 ];
    int Map[ 10 ][ 10 ];
    int Ans[ 10 ];
    
    bool Check1() {
    	return Map[ Ans[ 1 ] ][ Ans[ 2 ] ] || Map[ Ans[ 2 ] ][ Ans[ 3 ] ] || Map[ 1 ][ 1 ] || Map[ 2 ][ 2 ]|| Map[ 3 ][ 3 ];
    }
    
    bool Check2() {
    	return Map[ Ans[ 1 ] ][ Ans[ 2 ] ] || Map[ Ans[ 2 ] ][ Ans[ 3 ] ] || Map[ Ans[ 3 ] ][ Ans[ 1 ] ];
    }
    
    int main() {
    	scanf( "%d", &n );
    	scanf( "%s%s", A + 1, B + 1 );
    	Map[ A[ 1 ] - 'a' + 1 ][ A[ 2 ] - 'a' + 1 ] = 1;
    	Map[ B[ 1 ] - 'a' + 1 ][ B[ 2 ] - 'a' + 1 ] = 1;
    	Ans[ 1 ] = 1; Ans[ 2 ] = 2; Ans[ 3 ] = 3;
    	if( n == 1 ) {
    		while( Map[ Ans[ 1 ] ][ Ans[ 2 ] ] || Map[ Ans[ 2 ] ][ Ans[ 3 ] ] )
    			if( !next_permutation( Ans + 1, Ans + 4 ) ) {
    				printf( "NO
    " );
    				return 0;
    			}
    		printf( "YES
    " );
    		printf( "%c%c%c
    ", Ans[ 1 ] + 'a' - 1, Ans[ 2 ] + 'a' - 1, Ans[ 3 ] + 'a' - 1 );
    		return 0;
    	}
    	while( true ) {
    		if( !Check1() ) {
    			printf( "YES
    " );
    			for( int i = 1; i <= n; ++i ) printf( "%c", Ans[ 1 ] + 'a' - 1 );
    			for( int i = 1; i <= n; ++i ) printf( "%c", Ans[ 2 ] + 'a' - 1 );
    			for( int i = 1; i <= n; ++i ) printf( "%c", Ans[ 3 ] + 'a' - 1 );
    			printf( "
    " );
    			return 0;
    		}
    		if( !Check2() ) {
    			printf( "YES
    " );
    			for( int i = 1; i <= n; ++i )
    				printf( "%c%c%c", Ans[ 1 ] + 'a' - 1, Ans[ 2 ] + 'a' - 1, Ans[ 3 ] + 'a' - 1 ) ;
    			printf( "
    " );
    			return 0;
    		}
    		if( !next_permutation( Ans + 1, Ans + 4 ) ) {
    			printf( "NO
    " );
    			return 0;
    		}
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    组合数
    POJ2774 Long Long Message
    后缀排序【后缀数组入门题】
    luogu P3205 [HNOI2010]合唱队 区间dp
    luogu P3119 [USACO15JAN]Grass Cownoisseur G 有向图强连通分量+分层最短路
    luogu P3469 [POI2008]BLO-Blockade 割点
    luogu P2569 [SCOI2010]股票交易 单调优化dp
    luogu P2939 [USACO09FEB]Revamping Trails G 分层最短路
    luogu P3957 跳房子 二分+斜率优化dp
    luogu P1772 [ZJOI2006]物流运输 spfa最短路+dp
  • 原文地址:https://www.cnblogs.com/chy-2003/p/11479124.html
Copyright © 2011-2022 走看看