1. 程式人生 > 實用技巧 >P3384 【模板】輕重鏈剖分(樹鏈剖分)

P3384 【模板】輕重鏈剖分(樹鏈剖分)

原題連結

題解

這個題目貌似是個模擬題,直接模擬就是了

程式碼如下

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;
set<string> s;

int main(){
    int T; cin >> T;
    for(int k = 1; k <= T; ++ k){
        int n; cin >> n;
        string s1, s2, s12;
        string t = "";
        
        cin >> s1 >> s2 >> s12;

        int res = 0; bool flag = false;
        while(!s.count(t)){
            s.insert(t); t = "";
            for(int i = 0; i < n; ++ i) t += s2[i], t += s1[i];
            res ++;
            if(t == s12) {flag = true; break;}
            s1 = t.substr(0, n);
            s2 = t.substr(n, n);//題目中是說最高的C個,不是高的C個的頂部開始,不需要反轉
        }
        cout << k << ' ';
        if(!flag) cout << -1 << '\n';
        else cout << res << '\n';
        s.clear();
    }
    return 0;
}