Cod sursă (job #660378)

Utilizator avatar Dorde662 Dorde E Dorde662 IP ascuns
Problemă Deathnote Compilator cpp-32 | 1,63 kb
Rundă Arhiva de probleme Status evaluat
Dată 4 sept. 2022 15:50:54 Scor 50
#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;
}