AOJ 1142 Organize Your Train part II

問題

Organize Your Train part II | Aizu Online Judge

  • 与えられた文字列を2つに分けて、各部分文字列を逆向きにするか入れ替えるという操作をしてもよい
  • 生成される文字列が何種類あるか数える

方針

文字列を全部作る

コード

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
#define rep(i, n) for(int i=0; i<(n); ++i)

string rev_str(string &s, int start, int end) {
    string t;
    for(int i=end-1; i>=start; --i) t += s[i];
    return t;
}

int main(void){
    int m;
    map<string, int> hoge;
    cin >> m;
    rep(loop, m) {
        hoge.clear();
        string org, tmp, tmp2;
        cin >> org;
        hoge[org] = 1;
        int len = org.size();
        for(int i=1; i<len; ++i) {
            hoge[org.substr(0, i)+rev_str(org, i, len)] = 1;
            hoge[rev_str(org, 0, i)+org.substr(i, len-i)] = 1;
            hoge[rev_str(org, 0, i)+rev_str(org, i, len)] = 1;
            hoge[org.substr(i, len-i)+org.substr(0, i)] = 1;
            hoge[org.substr(i, len-i)+rev_str(org, 0, i)] = 1;
            hoge[rev_str(org, i, len)+org.substr(0, i)] = 1;
            hoge[rev_str(org, i, len)+rev_str(org, 0, i)] = 1;
        }
        map<string, int>::iterator it = hoge.begin();
        int ans = 0;
        while(it != hoge.end()) {
            ans += (*it).second;
            it++;
        }
        cout << ans << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1891775

反省

  • 文字列をひっくり返す方法がよく分からず結局関数を自作した
  • 「逆にした部分文字列」を入れる変数を作った方が見通しがきれいになった
  • mapではなくsetを使ったほうがきれいだった