0w1

LHPC 2016 pE. 教官的名字 ( Ad hoc, 構造, String, square-free sequence )

f:id:h0rnet:20160820215302p:plain
f:id:h0rnet:20160820215350p:plain
這題是需要想一下的構造題。本來想放棄亂寫 hash 臨時判斷,本地建答案,但突然想遞迴構造看看。
一開始我們有正確的 "ABC"
如果把 A, B, 和 C 當成各自不同的 pattern, 也就是說令 A = 某個 'A', 'B', 'C' 組成的亂七八糟的字串,B, C 亦同,並保證一些性質,似乎可以遞迴構造我們要的答案。考慮 "ABCACB",A = "ABC" ( 不能 "ABCA" ), B = "AC", C = "B" ( 不能 "CB", 看看 A ),我們可以保證 A, B, C 三個 pattern 怎麼接都不會有連續重複的 pattern。雖然還是不夠嚴謹,但丟丟看就 AC惹 =v=。
p.s. 事後知道這叫 square-free sequence, square 指連續重複出現兩次

void solve(){
    int N; cin >> N;
    string s = "ABC";
    while( s.size() < (int) 1e5 ){
        string ns;
        for( int i = 0; i < s.size(); ++i ){
            if( s[ i ] == 'A' )
                ns += "ABC";
            if( s[ i ] == 'B' )
                ns += "AC";
            if( s[ i ] == 'C' )
                ns += "B";
        }
        swap( s, ns );
    }
    cout << s.substr( 0, ( int ) 1e5 ) << endl;
}