結果
問題 | No.430 文字列検索 |
ユーザー | arktan763 |
提出日時 | 2019-11-21 15:12:24 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 234 ms / 2,000 ms |
コード長 | 5,270 bytes |
コンパイル時間 | 1,479 ms |
コンパイル使用メモリ | 177,976 KB |
実行使用メモリ | 28,032 KB |
最終ジャッジ日時 | 2024-11-10 00:38:25 |
合計ジャッジ時間 | 2,794 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 234 ms
28,032 KB |
testcase_02 | AC | 11 ms
5,248 KB |
testcase_03 | AC | 11 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 226 ms
27,648 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 13 ms
5,888 KB |
testcase_11 | AC | 56 ms
8,704 KB |
testcase_12 | AC | 56 ms
8,960 KB |
testcase_13 | AC | 58 ms
8,832 KB |
testcase_14 | AC | 43 ms
7,296 KB |
testcase_15 | AC | 34 ms
6,528 KB |
testcase_16 | AC | 13 ms
5,376 KB |
testcase_17 | AC | 11 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define int long long // #define double long double #define FOR(i, a, b) for(int i = (a); i < (b); ++i) #define FORR(i, a, b) for(int i = (a); i > (b); --i) #define REP(i, n) for(int i = 0; i < (n); ++i) #define REPR(i, n) for(int i = n; i >= 0; i--) #define FOREACH(x, a) for(auto &(x) : (a)) #define VECCIN(x) \ for(auto &youso_ : (x)) cin >> youso_ #define bitcnt(x) __builtin_popcount(x) #define lbit(x) __builtin_ffsll(x) #define rbit(x) __builtin_clzll(x) #define SZ(x) ((long long)(x).size()) #define fi first #define se second #define All(a) (a).begin(), (a).end() #define rAll(a) (a).rbegin(), (a).rend() #define cinfast() cin.tie(0), ios::sync_with_stdio(false) #define PERM(c) \ sort(All(c)); \ for(bool cp = true; cp; cp = next_permutation(All(c))) #define MKORDER(n) \ vector<int> od(n); \ iota(All(od), 0LL); template <typename T = long long> inline T IN() { T x; cin >> x; return (x); } inline void CIN() {} template <class Head, class... Tail> inline void CIN(Head &&head, Tail &&... tail) { cin >> head; CIN(move(tail)...); } #define CCIN(...) \ char __VA_ARGS__; \ CIN(__VA_ARGS__) #define DCIN(...) \ double __VA_ARGS__; \ CIN(__VA_ARGS__) #define LCIN(...) \ long long __VA_ARGS__; \ CIN(__VA_ARGS__) #define SCIN(...) \ string __VA_ARGS__; \ CIN(__VA_ARGS__) #define Yes(a) cout << (a ? "Yes" : "No") << "\n" #define YES(a) cout << (a ? "YES" : "NO") << "\n" #define Printv(v) \ { \ FOREACH(x, v) { cout << x << " "; } \ cout << "\n"; \ } template <typename T = string> inline void eputs(T s) { cout << s << "\n"; exit(0); } template <typename A, size_t N, typename T> void Fill(A (&array)[N], const T &val) { std::fill((T *)array, (T *)(array + N), val); } template <typename T> using PQG = priority_queue<T, vector<T>, greater<T>>; template <typename T> using PQ = priority_queue<T>; typedef long long ll; typedef vector<ll> VL; typedef vector<VL> VVL; typedef pair<ll, ll> PL; typedef vector<PL> VPL; typedef vector<bool> VB; typedef vector<double> VD; typedef vector<string> VS; const int INF = 1e9; const int MOD = 1e9 + 7; // const int MOD = 998244353; const ll LINF = 1e18; const double PI = atan(1.0) * 4.0; const ll dw[] = {1, 1, 0, -1, -1, -1, 0, 1}; const ll dh[] = {0, 1, 1, 1, 0, -1, -1, -1}; #define PI 3.141592653589793238 // ローリングハッシュ // 二分探索で LCP を求める機能つき struct RollingHash { static const int base1 = 1007, base2 = 2009; static const int mod1 = 1000000007, mod2 = 1000000009; vector<long long> hash1, hash2, power1, power2; // construct RollingHash(const string &S) { int n = (int)S.size(); hash1.assign(n + 1, 0); hash2.assign(n + 1, 0); power1.assign(n + 1, 1); power2.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; power1[i + 1] = (power1[i] * base1) % mod1; power2[i + 1] = (power2[i] * base2) % mod2; } } // get hash of S[left:right) inline pair<long long, long long> get(int l, int r) const { long long res1 = hash1[r] - hash1[l] * power1[r - l] % mod1; if(res1 < 0) res1 += mod1; long long res2 = hash2[r] - hash2[l] * power2[r - l] % mod2; if(res2 < 0) res2 += mod2; return {res1, res2}; } // get lcp of S[a:] and T[b:] 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; } }; signed main() { SCIN(S); LCIN(M); RollingHash rh(S); map<PL, ll> cnt; FOR(i, 1, 11) for(int j = 0; j + i - 1 < S.length(); j++) { cnt[rh.get(j, i + j)]++; } ll ans = 0; REP(i, M) { SCIN(C); RollingHash rhc(C); ans += cnt[rhc.get(0, C.size())]; } cout << ans << "\n"; }