結果
問題 | No.430 文字列検索 |
ユーザー | airis |
提出日時 | 2016-10-03 00:09:21 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,621 bytes |
コンパイル時間 | 1,121 ms |
コンパイル使用メモリ | 162,348 KB |
実行使用メモリ | 41,660 KB |
最終ジャッジ日時 | 2024-11-10 00:06:05 |
合計ジャッジ時間 | 4,500 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 10 ms
40,064 KB |
testcase_01 | TLE | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
testcase_04 | -- | - |
testcase_05 | -- | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
ソースコード
#include <bits/stdc++.h> #define rep(x, to) for (int x = 0; x < (to); x++) #define REP(x, a, to) for (int x = (a); x < (to); x++) #define EPS (1e-14) #define _PA(x,N) rep(i,N){cout<<x[i]<<" ";}cout<<endl; #define _PA2(x,H,W) rep(i,(H)){rep(j,(W)){cout<<x[i][j]<<" ";}cout<<endl;} using namespace std; typedef unsigned long long ull; typedef long long ll; typedef pair<int, int> PII; typedef pair<ll, ll> PLL; typedef complex<double> Complex; typedef vector< vector<int> > Mat; string S; int M; string C[5005]; ll ans; struct RollingHash { string s; ull p; ull mod; ull phash[int(1e+6) + 5]; ull pow[int(1e+6) + 5]; void init(string t, ull q=1e+9 + 7, ull m=(1ULL<<30)) { s = t; p = q; mod = m; memset(phash, 0, sizeof(phash)); memset(pow, 0, sizeof(pow)); } void build() { phash[0] = 0; //1-indexed pow[0] = 1;// 0-indexed for (int i = 0; i < (int)s.size(); i++) { phash[i + 1] = s[i] + phash[i] * p; phash[i + 1] %= mod; pow[i + 1] = p * pow[i]; pow[i + 1] %= mod; } } ull hash(int i, int j) { ull res = (phash[i] * pow[j - i]) % mod; return (phash[j] + mod - res) % mod; } size_t size() { return s.size(); } }; RollingHash rhs; RollingHash rhq; void solve() { rhs.init(S); rhs.build(); for (int i = 0; i < M; i++) { rhq.init(C[i]); rhq.build(); ull hash1 = rhq.hash(0, C[i].size()); for (int j = 0; j <= (int)S.size() - (int)C[i].size(); j++) { if (rhs.hash(j, j + C[i].size()) == hash1) { ans++; } } } cout << ans << endl; } int main() { cin >> S; cin >> M; for (int i = 0; i < M; i++) { cin >> C[i]; } solve(); return 0; }