結果
問題 | No.430 文字列検索 |
ユーザー | ta7uw |
提出日時 | 2019-10-13 14:05:08 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 288 ms / 2,000 ms |
コード長 | 3,242 bytes |
コンパイル時間 | 1,541 ms |
コンパイル使用メモリ | 182,820 KB |
実行使用メモリ | 27,776 KB |
最終ジャッジ日時 | 2024-11-10 00:36:14 |
合計ジャッジ時間 | 3,044 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 288 ms
27,776 KB |
testcase_02 | AC | 9 ms
5,248 KB |
testcase_03 | AC | 9 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 253 ms
27,648 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 17 ms
5,888 KB |
testcase_11 | AC | 74 ms
8,704 KB |
testcase_12 | AC | 75 ms
8,832 KB |
testcase_13 | AC | 72 ms
8,832 KB |
testcase_14 | AC | 56 ms
7,296 KB |
testcase_15 | AC | 43 ms
6,400 KB |
testcase_16 | AC | 12 ms
5,248 KB |
testcase_17 | AC | 9 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; using P = pair<ll, ll>; using Graph = vector<vector<ll>>; #define rep(i, n) for(ll i=0;i<(ll)(n);i++) #define rep2(i, m, n) for(ll i=m;i<(ll)(n);i++) #define rrep(i, n, m) for(ll i=n;i>=(ll)(m);i--) const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, 1, 0, -1}; const int ddx[8] = {0, 1, 1, 1, 0, -1, -1, -1}; const int ddy[8] = {1, 1, 0, -1, -1, -1, 0, 1}; const ll MOD = 1000000007; const ll INF = 1000000000000000000L; #ifdef __DEBUG /** * For DEBUG * https://github.com/ta7uw/cpp-pyprint */ #include "cpp-pyprint/pyprint.h" #endif class RollingHash { static const ll base1 = 1009; static const ll base2 = 2009; static const ll mod1 = 1000000007; static const ll mod2 = 1000000009; vector<ll> hash1, hash2, pow1, pow2; public: RollingHash(const string &S) { int n = (int) S.size(); hash1.assign(n + 1, 0); hash2.assign(n + 1, 0); pow1.assign(n + 1, 1); pow2.assign(n + 1, 1); for (int i = 0; i < n; ++i) { hash1[i + 1] = (hash1[i] * base1 + S[i]) % mod1; hash2[i + 1] = (hash2[i] * base2 + S[i]) % mod2; pow1[i + 1] = (pow1[i] * base1) % mod1; pow2[i + 1] = (pow2[i] * base2) % mod2; } } /** * S の [l, r) のハッシュ値を返す * O(1) */ inline pair<ll, ll> get(int l, int r) const { ll res1 = hash1[r] - hash1[l] * pow1[r - l] % mod1; if (res1 < 0) res1 += mod1; ll res2 = hash2[r] - hash2[l] * pow2[r - l] % mod2; if (res2 < 0) res2 += mod2; return make_pair(res1, res2); } /** * S のハッシュ値を返す * O(1) */ inline pair<ll, ll> hash() const { return get(0, (int) hash1.size() - 1); } /** * LCP (Longest Common Prefix) */ inline int getLCP(int a, int b) const { int len = min((int) hash1.size() - a, (int) hash1.size() - b); int low = 0, high = len; while (high - low > 1) { int mid = (low + high) >> 1; if (get(a, a + mid) != get(b, b + mid)) high = mid; else low = mid; } return low; } /** * hash h1 と 長さ h2_lenの 文字列のhash h2 を結合 */ pair<ll, ll> concat(pair<ll, ll> h1, pair<ll, ll> h2, int h2_len) { return make_pair((h1.first * pow1[h2_len] + h2.first) % mod1, (h1.second * pow2[h2_len] + h2.second) % mod2); } }; void Main() { string S; int M; cin >> S >> M; vector<string> C(M); rep(i, M) cin >> C[i]; RollingHash rollingHash(S); map<P, int> target; int N = (int) S.size(); rep(i, N) { rep2(j, 1, 11) { if (i + j <= N) { target[rollingHash.get(i, i + j)]++; } } } int ans = 0; rep(i, M) { string c = C[i]; RollingHash rollingHash1(c); P p = rollingHash1.hash(); if (target.find(p) != target.end()) { ans += target[p]; } } cout << ans << '\n'; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(15); Main(); return 0; }