Cod sursă (job #660321)

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

using namespace std;
ifstream fin("sabin.in");
ofstream fout("sabin.out");
int N , K , M , P , Q;
typedef struct node;
typedef struct node node;
typedef node* pnode;
struct node{
    int cnt;
    pnode fii[26];
    node() : cnt(0){
        fill(fii , fii + 26 , nullptr);
    }
};
struct trie{
    pnode root;
    trie(){root = nullptr;}
    void add(pnode &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(pnode &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;
string sh(vector<string> &v){
    string s;
    for(int j = 0 ; j < P ; ++ j){
        for(auto &y : v)
            s += y[j];
    }
    return s;
}
int main()
{
    fin >> N >> K >> M >> P >> Q;
    for(int i = 1 ; i <= N ; ++ i){
        vector<string> v(K);
        for(auto &y : v)
            fin >> y;
        string s = sh(v);
        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;
        vector<string> v(K);
        for(auto &y : v){
            int idx;
            fin >> idx;
            y = t[idx - 1];
        }
        string s = sh(v);
        fout << T.query(T.root , 0 , s , x * K) - (x == P ? 0 : T.query(T.root , 0 , s , x * K + K)) << '\n';
    }
    return 0;
}