Pagini recente »
Utilizatori înregistrați la Concurs clasa 6-a
|
Monitorul de evaluare
|
Cod sursă (job #660306)
Cod sursă (job
#660306)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("sabin.in");
ofstream fout("sabin.out");
int const mod1 = 1e9 + 7 , mod2 = 1e9 + 9;
int const NMAX = 20003 , MMAX = 30003;
int N , K , M , P , Q;
char S[NMAX][17][33];
char T[MMAX][33];
int h[NMAX][33];
int mul(int x , int y , int m){
return 1LL * x * y % m;
}
int add(int x , int y , int m){
return (1LL * x + y) % m;
}
struct query{
int x;
vector<int> pos;
map<int , int> ans;
query(){}
query(int _x , vector<int> _pos) : x(_x) , pos(_pos){}
}qx[NMAX];
void solve(int mod){
///h[i][j] -> pt raftul i
///concatenarea literelor de pe poz j
for(int i = 1 ; i <= N ; ++ i)
fill(h[i] , h[i] + 33 , 0);
for(int i = 1 ; i <= N ; ++ i){
for(int j = 1 ; j <= P ; ++ j){
int res(0);
for(int k = 1 ; k <= K ; ++ k){
//res = res * 26 + (S[i][k][j] - 'a');
res = add(S[i][k][j] - 'a' , mul(res , 26 , mod) , mod);
}
h[i][j] = res;
}
}
map<int , int> f;
int p26(1);
for(int i = 1 ; i <= K ; ++ i){
p26 = mul(p26 , 26 , mod);
}
for(int i = 1 ; i <= N ; ++ i){
int res(0);
++ f[res];
for(int j = 1 ; j <= P ; ++ j){
res = add(h[i][j] , mul(res , p26 , mod) , mod);
++ f[res];
}
}
for(int i = 1 ; i <= Q ; ++ i){
int res = 0;
for(int j = 1 ; j <= qx[i].x ; ++ j){
for(auto &y : qx[i].pos){
res = add(T[y][j] - 'a' , mul(res , 26 , mod) , mod);
}
}
int ans = f[res];
if(qx[i].x < P){
for(auto &y : qx[i].pos){
res = add(T[y][qx[i].x + 1] - 'a' , mul(res , 26 , mod) , mod);
}
ans -= f[res];
}
++ qx[i].ans[ans];
}
}
int main()
{
fin >> N >> K >> M >> P >> Q;
for(int i = 1 ; i <= N ; ++ i){
for(int j = 1 ; j <= K ; ++ j){
fin >> (S[i][j] + 1);
}
}
for(int i = 1 ; i <= M ; ++ i){
fin >> (T[i] + 1);
}
for(int i = 1 ; i <= Q ; ++ i){
int x;
vector<int> pos(K);
fin >> x;
for(int i = 0 ; i < K ; ++ i)
fin >> pos[i];
qx[i] = query(x , pos);
}
for(auto y : {mod1 , mod2 , 1190495513})
solve(y);
for(int i = 1 ; i <= Q ; ++ i){
if(qx[i].ans.size() > 1){
int mx(-1) , r(0);
for(auto &[a , b] : qx[i].ans){
if(b > mx){
mx = b;
r = a;
}
}
qx[i].ans.clear();
qx[i].ans[r] = 1;
}
fout << qx[i].ans.begin()->first << '\n';
}
return 0;
}