#include 
      
      
        <
      
      
        iostream
      
      
        >
      
      
        
        #include 
      
      
        <
      
      
        fstream
      
      
        >
      
      
        
      
      
        using
      
      
      
      
        namespace
      
      
         std;
        
        
        unsigned 
      
      
        short
      
      
         counter_3D[
      
      
        26
      
      
        ][
      
      
        26
      
      
        ][
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         };
        
        unsigned 
      
      
        short
      
      
         counter_2D[
      
      
        26
      
      
        ][
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         };
        
        unsigned 
      
      
        short
      
      
         counter_1D[
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         };
        
      
      
        char
      
      
         ret[
      
      
        1000001
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        '
      
      
        \0
      
      
        '
      
      
         };
        
      
      
        char
      
      
         seq[
      
      
        3
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         };
        
        
        
      
      
        int
      
      
         cnt
      
      
        =
      
      
        0
      
      
        ,check[
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         }, check2D[
      
      
        26
      
      
        ][
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         }, check3D[
      
      
        26
      
      
        ][
      
      
        26
      
      
        ][
      
      
        26
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        0
      
      
         };
        
      
      
        char
      
      
         test[
      
      
        1000001
      
      
        ] 
      
      
        =
      
      
         { 
      
      
        '
      
      
        \0
      
      
        '
      
      
         };
        
        
      
      
        int
      
      
         main() {
        
        
      
      
        /*
      
      
        ofstream fout;
        
            fout.open("output.txt");
      
      
        */
      
      
        
        
      
      
        int
      
      
         i,p1,p2,p3,j,l1,l2,l3,tmp;
        
            seq[
      
      
        0
      
      
        ] 
      
      
        =
      
      
         seq[
      
      
        1
      
      
        ] 
      
      
        =
      
      
      
      
        0
      
      
        ;
        
            p1 
      
      
        =
      
      
      
      
        0
      
      
        ; p2 
      
      
        =
      
      
      
      
        1
      
      
        ; p3 
      
      
        =
      
      
      
      
        2
      
      
        ;
        
            ret[
      
      
        0
      
      
        ] 
      
      
        =
      
      
         ret[
      
      
        1
      
      
        ] 
      
      
        =
      
      
      
      
        '
      
      
        a
      
      
        '
      
      
        ;
        
        
            counter_2D[seq[
      
      
        0
      
      
        ]][seq[
      
      
        0
      
      
        ]]
      
      
        ++
      
      
        ;
        
            counter_1D[seq[
      
      
        0
      
      
        ]]
      
      
        ++
      
      
        ;
        
            counter_1D[seq[
      
      
        1
      
      
        ]]
      
      
        ++
      
      
        ;
        
        
      
      
        for
      
      
        (i
      
      
        =
      
      
        2
      
      
        ;i
      
      
        <
      
      
        1000000
      
      
        ;i
      
      
        ++
      
      
        ) {
        
        
                l1 
      
      
        =
      
      
         seq[p1];
        
                l2 
      
      
        =
      
      
         seq[p2]; 
        
      
      
        for
      
      
        (j
      
      
        =
      
      
        1
      
      
        ;j
      
      
        <=
      
      
        26
      
      
        ;j
      
      
        ++
      
      
        ) {
        
                    l3 
      
      
        =
      
      
         (seq[p3] 
      
      
        +
      
      
         j) 
      
      
        %
      
      
      
      
        26
      
      
        ;
        
      
      
        if
      
      
        (counter_3D[l1][l2][l3] 
      
      
        <
      
      
      
      
        100
      
      
      
      
        &&
      
      
         counter_2D[l2][l3] 
      
      
        <
      
      
      
      
        2000
      
      
      
      
        &&
      
      
         counter_1D[l3] 
      
      
        <
      
      
      
      
        40000
      
      
        ) {
        
                        ret[i] 
      
      
        =
      
      
         l3 
      
      
        +
      
      
      
      
        '
      
      
        a
      
      
        '
      
      
        ;
        
                        seq[p3] 
      
      
        =
      
      
         l3;
        
                        tmp 
      
      
        =
      
      
         p1;
        
                        p1 
      
      
        =
      
      
         p2;
        
                        p2 
      
      
        =
      
      
         p3;
        
                        p3 
      
      
        =
      
      
         tmp;
        
                        counter_3D[l1][l2][l3]
      
      
        ++
      
      
        ;
        
                        counter_2D[l2][l3]
      
      
        ++
      
      
        ;
        
                        counter_1D[l3]
      
      
        ++
      
      
        ;
        
      
      
        break
      
      
        ;
        
                    }
        
                }
        
            }
        
        
            cout
      
      
        <<
      
      
        ret;
        
        
      
      
        return
      
      
      
      
        0
      
      
        ;
        
        }
        
      
      
        /*
      
      
        fout.close();
        
            ifstream fin;
        
            fin.open("output.txt",ios_base::in);
        
        
            i = 0;
        
            while(!fin.eof()) 
        
                fin>>test[i++];
        
        
            cnt = strlen(test);
        
            cout<<"count:"<<cnt<<endl;
        
        
            check[test[0]-'a']++;
        
            check[test[1]-'a']++;
        
            check2D[test[0] - 'a'][test[1] - 'a']++;
        
        
            i = 2;
        
            while(i < cnt ) {
        
                check[test[i] - 'a']++;
        
                check2D[test[i-1] - 'a'][test[i] - 'a']++;
        
                check3D[test[i-2] - 'a'][test[i-1] - 'a'][test[i] - 'a']++;
        
                i++;
        
            }
        
        
            for(int i=0;i<26;i++) {
        
                if(check[i] > 40000) {
        
                    cout<<"1 D exceeds\n"<<endl;
        
                    return 0;
        
                }
        
                for(int j=0;j<26;j++) {
        
                    if(check2D[i][j] > 2000) {
        
                        cout<<"2 D exceeds"<<check2D[i][j]<<endl;
        
                        cout<<(char)(i + 'a')<<(char)(j + 'a')<<endl;
        
                        return 0;
        
                    }
        
                    for(int k=0;k<26;k++) {
        
                        if(check3D[i][j][k] > 100) {
        
                            cout<<"3 D exceeds"<<check3D[i][j][k]<<endl;
        
                            cout<<(char)(i + 'a')<<(char)(j + 'a')<<(char)(k + 'a')<<endl;
        
                        }
        
                    }
        
                }
        
            }
        
        
            return 0;
        
        }
      
      
        */
      
    
  
這題我的基本思路是,每次都根據前面的兩個字母,來判斷跟第三個字母構成的組合是否能用(超過出現次數就不能了)。
不過這里有個小問題就是,例如aaa, 如果循環下一個找的還是aaa,那么這樣很快會耗掉"aaa"這組合的次數,通過驗證這樣的話構造不了1000000個。
但一個trick就是每次找的時候都從上一個找個字母的后一個字符開始,例如aaa,下一個找aab,然后找abc,bcd這樣,馬上就OK了 ^_^
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
					微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
					
