#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxN = 1e5 + 10;
int N, M;
string A[maxN], P[maxN], Q[maxN];
namespace sub1 {
bool check() { return N <= 100 && M <= 100; }
void solve() {
for(int i = 0; i < M; ++i) {
int cnt = 0;
for(int j = 0; j < N; ++j) {
if(A[j].size() < P[i].size() || A[j].size() < Q[i].size()) continue;
if(A[j].substr(0, P[i].size()) == P[i] && A[j].substr(A[j].size() - Q[i].size(), A[j].size()) == Q[i]) ++cnt;
}
cout << cnt << "\n";
}
}
};
namespace sub2 {
const ll base1 = 257;
const ll base2 = 263;
const ll MOD = 1e9 + 7;
bool check() { return N <= 5000 && M <= 5000; }
ll qpow(ll x, ll k) {
ll res = 0;
while(k) {
if(k & 1) res = res * x % MOD;
x = x * x % MOD;
k >>= 1;
}
return res;
}
void solve() {
vector<vector<ll>> _h(N);
int mx_sz = 0;
for(int i = 0; i < N; ++i) {
if(A[i].size() > mx_sz) mx_sz = A[i].size();
_h[i].resize(A[i].size());
for(int j = 0; j < A[i].size(); ++j) _h[i][j] = ((j ? _h[i][j - 1] : 0ll) * base1 + A[i][j]) % MOD;
//for(int j = 0; j < A[i].size(); ++j) cout << _h[i][j] << " "; cout << "\n";
}
vector<ll> pw(mx_sz); pw[0] = 1; pw[1] = base1;
for(int i = 2; i < pw.size(); ++i) pw[i] = pw[i - 1] * pw[1] % MOD;
for(int i = 0; i < M; ++i) {
ll res = 0;
ll valP = 0, valQ = 0;
for(int j = 0; j < P[i].size(); ++j) valP = (valP * base1 + P[i][j]) % MOD;
for(int j = 0; j < Q[i].size(); ++j) valQ = (valQ * base1 + Q[i][j]) % MOD;
//cout << valP << " " << valQ << "\n";
for(int j = 0; j < N; ++j) {
if(P[i].size() > A[j].size() || Q[i].size() > A[j].size()) continue;
if(valP == _h[j][P[i].size() - 1] &&
((Q[i].size() == A[j].size() && valQ == _h[j].back()) ||
(_h[j].back() - (_h[j][A[j].size() - Q[i].size() - 1]) * pw[Q[i].size()] % MOD + MOD) % MOD == valQ)) ++res;
}
cout << res << "\n";
}
}
void solve1() {
}
};
void solve() {
cin >> N >> M;
for(int i = 0; i < N; ++i) cin >> A[i];
for(int i = 0; i < M; ++i) cin >> P[i] >> Q[i];
//if(sub1::check()) return sub1::solve();
if(sub2::check()) return sub2::solve();
assert(false);
}
// T - S(i) = j
// T - S(j) = i
// S(j) - S(i) = j - i
// <=> S(j) - j = S(i) - i
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |