Cod sursă (job #660304)

Utilizator avatar Dorde662 Dorde E Dorde662 IP ascuns
Problemă Deathnote Compilator cpp-32 | 2,80 kb
Rundă Arhiva de probleme Status evaluat
Dată 3 sept. 2022 20:27:51 Scor 50
#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;
}