以下の内容はhttps://blog.hamayanhamayan.com/entry/2018/05/13/084044より取得しました。


K-th Substring [AtCoder Regular Contest 097 C]

https://beta.atcoder.jp/contests/arc097/tasks/arc097_a

考察

1. どうみても300点問題に見えない
2. 制約に目立つものがある「K≦5」
3. 全ての連続部分列を列挙してソートした5番目というのは、文字列の長さが必ず5以下になっている。
4. ソートして最初の5つだけ分かっていればいいので、全ての連続部分列を列挙せずとも、文字列長が5以下のものだけ列挙すればいい

解法

https://beta.atcoder.jp/contests/arc097/submissions/2495089

全ての連続部分列ではなく、長さ5以下の連続部分列を列挙して、重複を除いてソートして、K番目を出力すると答え。
rep(i, 0, N) rep(j, 1, 6)で先頭のインデックスがiで長さjの連続部分列を取ってきて入れている。
重複を除くにはソートして、uniqueを使って除くことができる。
vectorよりもsetを使ったほうが楽かもしれない。

#define all(x) (x).begin(),(x).end()


string S;
int K, N;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> S >> K;
    N = S.length();
 
    vector<string> s;
    rep(i, 0, N) rep(j, 1, 6) s.push_back(S.substr(i, j));
    sort(all(s));
    s.erase(unique(all(s)), s.end());
 
    cout << s[K - 1] << endl;
}



以上の内容はhttps://blog.hamayanhamayan.com/entry/2018/05/13/084044より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14