実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 81
問題概要
英小文字からなる文字列 が与えられる。 の連続部分文字列のうち、空でないものは何種類あるか。
制約
- の長さは1以上100以下。
考察
C++ のsubstr(pos, n)
は、pos
番目からn
文字の連続部分文字列を返す。ただし、n
は省略出来て、その場合はpos
番目から文字列の最後 (string::npos
) までの連続部分文字列を返す。なお、 C++20 までは、n
のデフォルト値はstring::npos
である。
本問ではこれを使うことによって の連続部分文字列を列挙していく。具体的には、 の長さを として、pos
を0
からl
まで、n
を1
からl
までループさせればよい。これで正しく動作する理由は、この関数の戻り値の項を参照。
あとは列挙した各要素をset
に格納して、最終的なset
の長さを出力すればよい。
コード
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++) // ======================================== // int main() { string S; cin >> S; set<string> st; rep(i, 0, S.size()) { for (int j = 1; i + j <= S.size(); j++) { st.insert(S.substr(i, j)); } } cout << st.size() << endl; }
実装時間: 5分