Cod sursă (job #660322)

Utilizator avatar Dorde662 Dorde E Dorde662 IP ascuns
Problemă Deathnote Compilator cpp-32 | 1,59 kb
Rundă Arhiva de probleme Status evaluat
Dată 4 sept. 2022 00:59:07 Scor 60
#include <bits/stdc++.h>

using namespace std;
ifstream fin("sabin.in");
ofstream fout("sabin.out");
int N , K , M , P , Q;
struct node{
    int cnt;
    node *fii[26];
    node() : cnt(0){
        fill(fii , fii + 26 , nullptr);
    }
};
struct trie{
    node *root;
    trie(){root = nullptr;}
    void add(node *&x , int idx , string &s){
        if(x == nullptr){
            x = new node;
        }
        ++ x->cnt;
        if(idx < s.size())
            add(x->fii[s[idx] - 'a'] , idx + 1 , s);
    }
    int query(node *&x , int idx , string &s , int p){
        if(x == nullptr)
            return 0;
        if(!p)
            return x->cnt;
        return query(x->fii[s[idx] - 'a'] , idx + 1 , s , p - 1);
    }
}T;
int main()
{
    fin >> N >> K >> M >> P >> Q;
    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];
        }
        T.add(T.root , 0 , 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 << T.query(T.root , 0 , s , x * K) - (x == P ? 0 : T.query(T.root , 0 , s , x * K + K)) << '\n';
    }
    return 0;
}