Pagini recente »
2022-04-01-clasa-6-concurs20-cursuri-performanta
|
Cod sursă (job #435534)
|
Rating Eftime Andrei (CM_Punk)
|
Rating Dragan Sebastian (sebidragan)
|
Cod sursă (job #660378)
Cod sursă (job
#660378)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("sabin.in");
ofstream fout("sabin.out");
int N , K , M , P , Q;
struct trie{
int cnt;
unordered_map<char , trie*> fii;
trie() : cnt(0){}
};
void add(trie *&x , string &s){
if(x == nullptr)
x = new trie();
trie *y = x;
for(int i = 0 ; i < s.size() ; ++ i){
if(y->fii.find(s[i]) == y->fii.end())
y->fii[s[i]] = new trie();
++ y->fii[s[i]]->cnt;
y = y->fii[s[i]];
}
}
int query(trie *&x , string &s , int k){
if(!k) return N;
if(x == nullptr)
return 0;
trie *y = x;
for(int i = 0 ; i < k ; ++ i){
if(y->fii[s[i]] == nullptr)
return 0;
y = y->fii[s[i]];
}
return y->cnt;
}
int main()
{;
fin >> N >> K >> M >> P >> Q;
trie *root = nullptr;
vector<string> v(K);
string s;
for(int i = 1 ; i <= N ; ++ i){
for(auto &y : v)
fin >> y;
s = "";
for(int j = 0 ; j < P ; ++ j){
for(auto &y : v)
s += y[j];
}
add(root , s);
}
vector<string> t(M);
for(auto &y : t){
fin >> y;
}
for(int i = 1 ; i <= Q ; ++ i){
int x;
fin >> x;
for(auto &y : v){
int idx;
fin >> idx;
y = t[idx - 1];
}
s = "";
for(int j = 0 ; j < x + 1 ; ++ j){
for(auto &y : v)
s += y[j];
}
fout << query(root , s , x * K) - (x == P ? 0 : query(root , s , x * K + K)) << '\n';
}
return 0;
}