3007

ちょっと訳ありで速くしてみた。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

struct Data {
    const char* s1;
    int l1;

    const char* s2;

    Data(const char* s1, int l1, const char* s2)
        : s1(s1), l1(l1), s2(s2) {}

    char operator [](int n) const {
        if (n < l1) return s1[n];
        else return s2[n - l1];
    }
};

int Length;

bool operator <(const Data& lhs, const Data& rhs)
{
    for (int i = 0; i < Length; i++) {
        if (lhs[i] != rhs[i]) return lhs[i] < rhs[i];
    }
    return false;
}

bool operator ==(const Data& lhs, const Data& rhs)
{
    for (int i = 0; i < Length; i++) {
        if (lhs[i] != rhs[i]) return false;
    }
    return true;
}

int main()
{
    string str, rstr;
    
    vector<Data> s;
    int t;

    cin >> t;
    while (t--) {
        char tmp[128];
        scanf("%s", tmp);
        s.clear();

        str = tmp;
        rstr = str;
        reverse(rstr.begin(), rstr.end());
        Length = str.size();

        const char* s1 = str.c_str();
        const char* r1 = rstr.c_str();

        s.push_back(Data(s1, Length, NULL));
        s.push_back(Data(r1, Length, NULL));

        for (int i = 1; i < Length; i++) {
            // back + front(same order)
            s.push_back(Data(s1 + i, Length - i, s1));
            s.push_back(Data(r1 + i, Length - i, r1));

            // front + r_back, r_back + front
            s.push_back(Data(s1, i, r1));
            s.push_back(Data(r1, i, s1));

            // r_front + back, back + r_front
            s.push_back(Data(r1 + i, Length - i, s1 + Length - i));
            s.push_back(Data(s1 + Length - i, i, r1 + i));
        }

        sort(s.begin(), s.end());
        s.erase(unique(s.begin(), s.end()), s.end());

        cout << s.size() << endl;
    }
}

適当でサーセンw cinとscanf混ぜて使って良いのは小学生までだよねー。Lengthはグローバル変数だから、最適化されずに毎回読み込まれたりしてねーよなーとかの心配事や、そぎ落とせそうな贅肉はまだあるけどとりあえず94ms。1位は76ms。とりあえず使ってるアルゴリズムは違わなそうなので安心。あまりに時間がかかるから、何か変な方法使ってんのかな?とか思ってしまった。ところでメモリ使用量はどうやると減るんでしょうかうううう。

つかPKU最近タイマー変わった?ちょっと古いタイムと約16のアライメントが違う気がする。