結果
問題 |
No.430 文字列検索
|
ユーザー |
|
提出日時 | 2025-07-26 15:55:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 77 ms / 2,000 ms |
コード長 | 1,516 bytes |
コンパイル時間 | 3,221 ms |
コンパイル使用メモリ | 287,244 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-07-26 15:55:11 |
合計ジャッジ時間 | 4,537 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 14 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for (int i = 0; i< (n); ++i) #define repi(i, a, b) for (int i = (a); i < (b); ++i) #define all(x) (x).begin(), (x).end() #define fore(i, a) for(auto &i:a) using ll = long long; //b:999999797, 999999883, 1000000007, 1000000009, 2147483647, 2147771771 struct roling_hash{ vector<ll> H, B; ll n, b, mod; string s; roling_hash(string s_,ll b_, ll mod_){ s = s_;b = b_; mod = mod_; n = s.size()+1; H.assign(n,0); B.assign(n,0); H[0] = 0; B[0] = 1; repi(i, 1, n){ H[i] = (b*H[i-1]%mod+s[i-1])%mod; B[i] = B[i-1]*b%mod; } } ll get_hash(ll l,ll r){ return (H[r+1] - B[r-l+1]*H[l]%mod+mod)%mod; } ll get_hash(string t){ ll res=0; ll sz = t.size(); rep(i, sz){ res += B[sz-1-i]*t[i]%mod; res %= mod; } return res; } }; long long random_large_ll() { static std::random_device rd; static std::mt19937_64 gen(rd()); std::uniform_int_distribution<long long> dist(100000LL, 1000000000LL); return dist(gen); } int main() { string s; ll m; cin >> s >> m; ll b = random_large_ll(), mod = 1000000007; ll b2 = random_large_ll(), mod2 = 1000000009; set<ll> h,h2; roling_hash RH(s, b, mod); roling_hash RH2(s, b2, mod2); rep(i, m){ string c; cin >> c; h.insert(RH.get_hash(c)); h2.insert(RH2.get_hash(c)); } ll ans = 0; rep(i, 10){ ll l = 0,r = l+i; while(r < s.size()){ if(h.count(RH.get_hash(l, r)) && h2.count(RH2.get_hash(l, r)))ans++; l++;r++; } } cout << ans << endl; }