This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include<fstream>
using namespace std;
#pragma GCC optimize ("Ofast")
#define all(x) x.begin() , x.end()
#define gcd __gcd
typedef long long int ll;
typedef pair<ll , ll> pll;
typedef pair<int , int> pii;
typedef long double db;
struct piii {
int first , second , third;
};
typedef pair<pii , pii> piiii;
const ll MAX_N = 1e5 + 20 , md = 1100000123;
ll tav(ll n , ll k){
ll res = 1;
while(k > 0){
if(k & 1){
res *= n;
}
n *= n;
k /= 2;
}
return res;
}
vector<ll> ph[MAX_N] , sh[MAX_N] , p , s;
ll oo , qq , sz[MAX_N] , x = 0 , qh[MAX_N] , oh[MAX_N] , osz[MAX_N] , qsz[MAX_N];
map<piiii , int> mp;
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll n , m , sq;
cin>>n>>m; sq = sqrt(n);
if(n <= 5e3 || m <= 5e3){
for(int i = 0 ; i < n ; i++){
string s;
cin>>s;
ll h = s.size(); sz[i] = h;
for(int j = 0 ; j < h ; j++){
if(s[j] == 'A'){
s[j] = 0;
}
if(s[j] == 'C'){
s[j] = 1;
}
if(s[j] == 'G'){
s[j] = 2;
}
if(s[j] == 'U'){
s[j] = 3;
}
}
ll t = 1 , hash = 0;
ph[i].resize(h); sh[i].resize(h);
for(int j = 0 ; j < h ; j++){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
ph[i][j] = hash;
}
hash = 0; t = 1;
for(int j = h - 1 ; j >= 0 ; j--){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
sh[i][j] = hash;
}
}
for(int i = 0 ; i < m ; i++){
string o , q;
cin>>o>>q;
ll hash = 0 , t = 1 , os = o.size() , qs = q.size(); osz[i] = os; qsz[i] = qs;
for(int j = 0 ; j < os ; j++){
if(o[j] == 'A'){
o[j] = 0;
}
if(o[j] == 'C'){
o[j] = 1;
}
if(o[j] == 'G'){
o[j] = 2;
}
if(o[j] == 'U'){
o[j] = 3;
}
}
for(int j = 0 ; j < qs ; j++){
if(q[j] == 'A'){
q[j] = 0;
}
if(q[j] == 'C'){
q[j] = 1;
}
if(q[j] == 'G'){
q[j] = 2;
}
if(q[j] == 'U'){
q[j] = 3;
}
}
for(int j = 0 ; j < os ; j++){
hash += 1ll * t * o[j]; hash %= md;
t *= 4; t %= md;
}
oh[i] = hash;
hash = 0; t = 1;
for(int j = qs - 1 ; j >= 0 ; j--){
hash += 1ll * t * q[j]; hash %= md;
t *= 4; t %= md;
}
qh[i] = hash;
}
for(int i = 0 ; i < m ; i++){
ll cnt = 0;
for(int j = 0 ; j < n ; j++){
if(osz[i] > sz[j] || qsz[i] > sz[j]) continue;
if(oh[i] != ph[j][osz[i] - 1]) continue;
if(qh[i] != sh[j][sz[j] - qsz[i]]) continue;
cnt++;
}
cout<<cnt<<'\n';
}
return 0;
}
for(int i = 0 ; i < n ; i++){
string s;
cin>>s;
ll h = s.size();
if(h < sq){
for(int j = 0 ; j < h ; j++){
if(s[j] == 'A'){
s[j] = 0;
}
if(s[j] == 'C'){
s[j] = 1;
}
if(s[j] == 'G'){
s[j] = 2;
}
if(s[j] == 'U'){
s[j] = 3;
}
}
ll t = 1 , hash = 0;
p.resize(h); s.resize(h);
for(int j = 0 ; j < h ; j++){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
p[j] = hash;
}
hash = 0; t = 1;
for(int j = h - 1 ; j >= 0 ; j--){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
s[j] = hash;
}
for(int i = 0 ; i < h ; i++){
for(int j = 0 ; j < h ; j++){
mp[{{i , j} , {p[i] , s[i]}}]++;
}
}
continue;
}
sz[x] = h;
for(int j = 0 ; j < h ; j++){
if(s[j] == 'A'){
s[j] = 0;
}
if(s[j] == 'C'){
s[j] = 1;
}
if(s[j] == 'G'){
s[j] = 2;
}
if(s[j] == 'U'){
s[j] = 3;
}
}
ll t = 1 , hash = 0;
ph[x].resize(h); sh[x].resize(h);
for(int j = 0 ; j < h ; j++){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
ph[x][j] = hash;
}
hash = 0; t = 1;
for(int j = h - 1 ; j >= 0 ; j--){
hash += 1ll * t * s[j]; hash %= md;
t *= 4; t %= md;
sh[x][j] = hash;
}
x++;
}
for(int i = 0 ; i < m ; i++){
string o , q;
cin>>o>>q;
ll hash = 0 , t = 1 , os = o.size() , qs = q.size(); osz[i] = os; qsz[i] = qs;
for(int j = 0 ; j < os ; j++){
if(o[j] == 'A'){
o[j] = 0;
}
if(o[j] == 'C'){
o[j] = 1;
}
if(o[j] == 'G'){
o[j] = 2;
}
if(o[j] == 'U'){
o[j] = 3;
}
}
for(int j = 0 ; j < qs ; j++){
if(q[j] == 'A'){
q[j] = 0;
}
if(q[j] == 'C'){
q[j] = 1;
}
if(q[j] == 'G'){
q[j] = 2;
}
if(q[j] == 'U'){
q[j] = 3;
}
}
for(int j = 0 ; j < os ; j++){
hash += 1ll * t * o[j]; hash %= md;
t *= 4; t %= md;
}
oo = hash;
hash = 0; t = 1;
for(int j = qs - 1 ; j >= 0 ; j--){
hash += 1ll * t * q[j]; hash %= md;
t *= 4; t %= md;
}
qq = hash;
ll ans = mp[{{os , qs} , {oo , qq}}];
for(int i = 0 ; i < m ; i++){
for(int j = 0 ; j < n ; j++){
if(osz[i] > sz[j] || qsz[i] > sz[j]) continue;
if(oh[i] != ph[j][osz[i] - 1]) continue;
if(qh[i] != sh[j][sz[j] - qsz[i]]) continue;
ans++;
}
cout<<ans<<'\n';
}
}
return 0;
}
# | 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... |