[AOJ] No. 0578 看板 (Signboard)
問題
方針
制約が緩いので愚直に文字列を走査していきます。
古い看板から作ることができる看板の例を考えます。例えば、お店の名前の文字列の長さが \( 3 \) であり、古い看板の文字列の長さが \( 7 \) のとき、文字列の添え字を列挙します。
- 間隔が \( 1 \) のとき
\( (1, 2, 3)\), \( (2, 3, 4) \), \( (3, 4, 5) \), \( (4, 5, 6)\), \( (5, 6, 7) \)
- 間隔が \( 2 \) のとき
\( (1, 3, 5)\), \( (2, 4, 6) \), \( (3, 5, 7)\)
- 間隔が \( 3 \) のとき
\( (1, 4, 7)\)
上記のように走査することで回答が得られます。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int N; cin >> N; string t; cin >> t; string s[N]; for (int i = 0; i < N; i++) { cin >> s[i]; } int ans = 0; for (int i = 0; i < N; i++) { for (int j = 0; j <= s[i].length() - t.length(); j++) { for (int k = 1; k < 100; k++) { for (int l = 0; l < t.length(); l++) { int idx = j + k * l; if (idx >= s[i].length()) break; if (s[i][idx] != t[l]) break; if (l == t.length() - 1) { ans++; goto loop; } } } } loop:; } cout << ans << "\n"; return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません