結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
Manuel1024
|
| 提出日時 | 2023-01-09 01:51:00 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 114 ms / 2,000 ms |
| コード長 | 2,188 bytes |
| コンパイル時間 | 974 ms |
| コンパイル使用メモリ | 97,408 KB |
| 実行使用メモリ | 13,092 KB |
| 最終ジャッジ日時 | 2024-11-10 01:03:50 |
| 合計ジャッジ時間 | 2,466 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 14 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
using ll = long long;
constexpr ll MOD1 = 998244353;
constexpr ll MOD2 = 1000000007;
mt19937 mt{random_device{}()};
int main(){
string s0; cin >> s0;
int m; cin >> m;
vector<string> c0(m);
for(auto &it: c0) cin >> it;
vector<int> s(s0.size());
for(int i = 0; i < s0.size(); i++) s[i] = s0[i]-'A'+1;
vector<vector<int>> c(m);
for(int i = 0; i < m; i++){
c[i] = vector<int>(c0[i].size());
for(int j = 0; j < c0[i].size(); j++) c[i][j] = c0[i][j]-'A'+1;
}
// hashs[i][j] := s[j, j+i) のハッシュ値
vector<vector<ll>> hashs1(11, vector<ll>(s.size())), hashs2(11, vector<ll>(s.size()));
auto kisuu = [&](ll mod){
while(true){
ll b = mt()%mod;
if(1 < b) return b;
}
};
const ll b1 = kisuu(MOD1), b2 = kisuu(MOD2);
for(int i = 1; i <= min(10, (int)s.size()); i++){
hashs1[i][0] = 0;
hashs2[i][0] = 0;
ll bm1 = 1, bm2 = 1;
for(int j = i-1; j >= 0; j--){
hashs1[i][0] += s[j]*bm1%MOD1;
hashs1[i][0] %= MOD1;
bm1 *= b1;
bm1 %= MOD1;
hashs2[i][0] += s[j]*bm2%MOD2;
hashs2[i][0] %= MOD2;
bm2 *= b2;
bm2 %= MOD2;
}
for(int j = 1; j+i-1 < s.size(); j++){
hashs1[i][j] = (hashs1[i][j-1]*b1 - s[j-1]*bm1 + s[j+i-1] + MOD1)%MOD1;
hashs2[i][j] = (hashs2[i][j-1]*b2 - s[j-1]*bm2 + s[j+i-1] + MOD2)%MOD2;
}
}
ll ans = 0;
for(const auto &vec: c){
ll hs1 = 0, hs2 = 0;
ll bm1 = 1, bm2 = 1;
for(int j = vec.size()-1; j >= 0; j--){
hs1 += vec[j]*bm1%MOD1;
hs1 %= MOD1;
bm1 *= b1;
bm1 %= MOD1;
hs2 += vec[j]*bm2%MOD2;
hs2 %= MOD2;
bm2 *= b2;
bm2 %= MOD2;
}
for(int i = 0; i+vec.size()-1 < s.size(); i++){
if(hashs1[vec.size()][i] == hs1 && hashs2[vec.size()][i] == hs2) ans++;
}
}
cout << ans << endl;
return 0;
}
Manuel1024