結果
問題 | No.430 文字列検索 |
ユーザー | kakira9618 |
提出日時 | 2019-03-15 03:29:17 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,021 bytes |
コンパイル時間 | 657 ms |
コンパイル使用メモリ | 78,224 KB |
実行使用メモリ | 14,812 KB |
最終ジャッジ日時 | 2024-11-10 00:23:17 |
合計ジャッジ時間 | 4,004 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
10,496 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 <iostream> #include <vector> #include <algorithm> #include <complex> using namespace std; typedef complex<double> C; void fft(vector<C> &f, int n, int dir) { if (n == 1) return; vector<C> f0, f1; for (int i = 0; i < n; i++) { if (i % 2 == 0) { f0.push_back(f[i]); } else { f1.push_back(f[i]); } } fft(f0, n / 2, dir); fft(f1, n / 2, dir); C now = C(1.0, 0); C zeta = polar(1.0, 2 * acos(-1) * dir / n); for(int i = 0; i < n; i++) { f[i] = f0[i % (n / 2)] + now * f1[i % (n / 2)]; now *= zeta; } } vector<C> comb(vector<C> A, vector<C> B) { int size = A.size() + B.size(); int n = 1; while(n < size) n <<= 1; A.resize(n); B.resize(n); fft(A, n, 1); fft(B, n, 1); vector<C> ret; for(int i = 0; i < n; i++) { ret.push_back(A[i] * B[i]); } fft(ret, n, -1); for(int i = 0; i < n; i++) { ret[i] /= n; } return ret; } int solve(string &A, string &B) { int N = A.size(), M = B.size(); vector<int> cnt(N + M); for(char c = 'A'; c <= 'Z'; c++) { vector<C> S(N), T(M); for(int k = 0; k < N; k++) { S[k] = C((A[k] == c), 0); } for(int k = 0; k < M; k++) { T[k] = C((B[k] == c), 0); } reverse(T.begin(), T.end()); vector<C> ret = comb(S, T); for(int k = 0; k < N + M; k++) { cnt[k] += (int)(real(ret[k]) + 0.1); } } int ret = 0; for(int k = 0; k < N + M; k++) { if (cnt[k] == B.size()) { ret++; } } return ret; } void solve() { string s; cin >> s; int N; cin >> N; int ans = 0; for (int i = 0; i < N; i++) { string t; cin >> t; ans += solve(s, t); } cout << ans << endl; } int main() { cin.tie(0); ios::sync_with_stdio(false); cout.setf(ios::fixed); cout.precision(16); solve(); return 0; }