結果
| 問題 | No.430 文字列検索 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2021-03-05 15:10:17 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 804 ms / 2,000 ms | 
| コード長 | 2,244 bytes | 
| コンパイル時間 | 1,880 ms | 
| コンパイル使用メモリ | 203,540 KB | 
| 最終ジャッジ日時 | 2025-01-19 10:22:18 | 
| ジャッジサーバーID (参考情報) | judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 14 | 
ソースコード
#include <bits/stdc++.h>
typedef long long ll;
#define rep(i, n) for (ll i = 0, i##_len = (n); i < i##_len; ++i)
#define reps(i, n) for (ll i = 1, i##_len = (n); i <= i##_len; ++i)
#define rrep(i, n) for (ll i = ((ll)(n)-1); i >= 0; --i)
#define rreps(i, n) for (ll i = ((ll)(n)); i > 0; --i)
#define rep2(i, s, n) for (ll i = (s); i < (ll)(n); i++)
#define repc2(i, s, n) for (ll i = (s); i <= (ll)(n); i++)
#define inf 2e9
#define linf 9000000000000000000ll
#define all(v) v.begin(), v.end()
using namespace std;
const long long M1 = 998244353;
const long long M2 = 1000000007;
const long long B1 = 10007;
const long long B2 = 9973;
template <long long MOD1, long long MOD2, long long BASE1, long long BASE2>
class RollingHash {
   private:
    vector<ll> hash1, power1, hash2, power2;
    using hash = pair<ll, ll>;
    int size;
   public:
    RollingHash() {}
    RollingHash(const string &str) {
        size = str.size();
        hash1 = vector<ll>(size + 1, 0);
        hash2 = vector<ll>(size + 1, 0);
        power1 = vector<ll>(size + 1, 1);
        power2 = vector<ll>(size + 1, 1);
        for (int i = 1; i <= size; i++) {
            hash1[i] = (hash1[i - 1] + str[i - 1]) * BASE1 % MOD1;
            hash2[i] = (hash2[i - 1] + str[i - 1]) * BASE2 % MOD2;
            power1[i] = power1[i - 1] * BASE1 % MOD1;
            power2[i] = power2[i - 1] * BASE2 % MOD2;
        }
    }
    hash get(int l, int r) { return make_pair(((hash1[r] - hash1[l] * power1[r - l]) % MOD1 + MOD1) % MOD1, ((hash2[r] - hash2[l] * power2[r - l]) % MOD2 + MOD2) % MOD2); }
    hash concat(hash h1, hash h2, int h2_length) { return make_pair((h1.first * power1[h2_length] + h2.first) % MOD1, (h1.second * power2[h2_length] + h2.second) % MOD2); }
};
using RH = RollingHash<M1, M2, B1, B2>;
int main() {
    string s;
    int m;
    cin >> s >> m;
    vector<string> v(m);
    rep(i, m) cin >> v.at(i);
    RH srh(s);
    vector<RH> vrh(m);
    rep(i, m) { vrh.at(i) = RH(v.at(i)); }
    int cnt = 0;
    rep(i, m) {
        rep(j, s.size() - v.at(i).size() + 1) {
            if (srh.get(j, j + v.at(i).size()) == vrh.at(i).get(0, v.at(i).size())) {
                cnt++;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}
            
            
            
        