답안 #112644

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
112644 2019-05-21T06:52:01 Z MladenP Selling RNA Strands (JOI16_selling_rna) C++17
0 / 100
1500 ms 207360 KB
#include<bits/stdc++.h>
#define STIZE(x) fprintf(stderr, "STIZE%d\n", x);
#define PRINT(x) fprintf(stderr, "%s = %d\n", #x, x);
#define NL(x) printf("%c", " \n"[(x)]);
#define lld long long
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
#define mid (l+r)/2
#define endl '\n'
#define all(a) begin(a),end(a)
#define sz(a) int((a).size())
#define LINF 1000000000000000LL
#define INF 1000000000
#define EPS 1e-9
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
using namespace std;
#define MAXL 2000001
#define MAXN 100010
#define MOD 29996224275833LL
int trie[MAXL][4], siz[MAXL], idx[MAXL], nodes, timer, hshidx, key, f[300];
bool sorted[MAXL];
vector<int> gde[MAXL], inNode[MAXL];
unordered_map<int,int> cudo, celi;
lld hsh[MAXN], hsh1[MAXN], st[MAXN];
string P, Q, S;
inline void ubaci(int node, string &s, int idx, int len) {
    if(idx == len) return;
    int c = f[s[idx]];
    if(trie[node][c] == 0) trie[node][c] = ++nodes;
    //gde[hsh[len-1-idx]].pb(node);
    inNode[node].pb(hsh[len-1-idx]);
    ubaci(trie[node][c], s, idx+1, len);
}
inline int DFS(int node) {
    idx[node] = ++timer;
    for(auto x : inNode[node]) gde[x].pb(idx[node]);
    for(int i = 0; i < 4; i++) if(trie[node][i]) siz[node] += DFS(trie[node][i]);
    return ++siz[node];
}
inline void hashuj(string &s, lld hsh[], int lens) {
    memset(hsh, 0, sizeof(hsh));
    hsh[0] = 0;
    for(int i = lens-1, ob = 0; i >= 0; i--, ob++) {
        hsh[ob] += st[ob]*(f[s[i]]+1);
        //hsh[ob+1] = 0;
        hsh[ob+1] = hsh[ob];
        if(hsh[ob] >= MOD) hsh[ob] %= MOD;
        //hsh[ob+1] = hsh[ob];
        if(i == 0) celi[hsh[ob]]++;
        if(cudo[hsh[ob]] == 0) cudo[hsh[ob]] = ++hshidx;
        hsh[ob] = cudo[hsh[ob]];
    }
}
inline void hashuj1(string &s, lld hsh[], int lens) {
    memset(hsh, 0, sizeof(hsh));
    hsh[0] = 0;
    for(int i = lens-1, ob = 0; i >= 0; i--, ob++) {
        hsh[ob] += st[ob]*(f[s[i]]+1);
        //hsh[ob+1] = 0;
        hsh[ob+1] = hsh[ob];
        //PRINT(hsh[ob]);
        if(hsh[ob] >= MOD) hsh[ob] %= MOD;
        //hsh[ob+1] = hsh[ob];
    }
}
inline int query(int node, string &s, int idxx, int len) {
    if(idxx == len) return node;
    int c = f[s[idxx]];
    if(trie[node][c] == 0) return -1;
    return query(trie[node][c], s, idxx+1, len);
}
int main() {
     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int N, M; cin >> N >> M;
    f['A'] = 0, f['G'] = 1, f['C'] = 2, f['U'] = 3, st[0] = 1;
    for(int i = 1; i < MAXN; i++) st[i] = (st[i-1]*5 >= MOD ? (st[i-1]*5)%MOD : st[i-1]*5);
    for(int i = 1; i <= N; i++) {
        cin >> S;
        int lenS = sz(S);
        hashuj(S, hsh, lenS);
        ubaci(0, S, 0, lenS);
    }
    DFS(0);
    for(int q = 0; q < M; q++) {
        int rez = 0;
        cin >> P >> Q;
        int lenQ = sz(Q), lenP = sz(P);
        hashuj1(Q, hsh, lenQ); key = cudo[hsh[lenQ-1]];
        int koji = query(0, P, 0, lenP);
        if(key == 0 || koji == -1) {
            cout << 0 << endl;
            continue;
        }
        /*if(!sorted[key]) {
            for(int i = 0; i < sz(gde[key]); i++) gde[key][i] = idx[gde[key][i]];
            sort(all(gde[key]));
            sorted[key] = 1;
        }*/
        hashuj1(P, hsh1, lenP);
        for(int i = 0; i < lenQ; i++) {
            if(hsh[lenQ-1] - hsh[lenQ-2-i] == hsh1[i]*st[lenQ-i-1]) {
                lld cur = hsh1[lenP-1]*st[lenQ-i-1] + hsh[lenQ-2-i];
                rez += celi[cur];
            }
        }
        rez += upper_bound(all(gde[key]), idx[koji]+siz[koji]-1) - lower_bound(all(gde[key]), idx[koji]);
        cout << rez << endl;
    }
    return 0;
}

Compilation message

selling_rna.cpp: In function 'void ubaci(int, std::__cxx11::string&, int, int)':
selling_rna.cpp:31:21: warning: array subscript has type 'char' [-Wchar-subscripts]
     int c = f[s[idx]];
                     ^
selling_rna.cpp: In function 'void hashuj(std::__cxx11::string&, long long int*, int)':
selling_rna.cpp:44:30: warning: 'sizeof' on array function parameter 'hsh' will return size of 'long long int*' [-Wsizeof-array-argument]
     memset(hsh, 0, sizeof(hsh));
                              ^
selling_rna.cpp:43:39: note: declared here
 inline void hashuj(string &s, lld hsh[], int lens) {
                                       ^
selling_rna.cpp:44:26: warning: argument to 'sizeof' in 'void* memset(void*, int, size_t)' call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
     memset(hsh, 0, sizeof(hsh));
                          ^
selling_rna.cpp:47:34: warning: array subscript has type 'char' [-Wchar-subscripts]
         hsh[ob] += st[ob]*(f[s[i]]+1);
                                  ^
selling_rna.cpp: In function 'void hashuj1(std::__cxx11::string&, long long int*, int)':
selling_rna.cpp:58:30: warning: 'sizeof' on array function parameter 'hsh' will return size of 'long long int*' [-Wsizeof-array-argument]
     memset(hsh, 0, sizeof(hsh));
                              ^
selling_rna.cpp:57:40: note: declared here
 inline void hashuj1(string &s, lld hsh[], int lens) {
                                        ^
selling_rna.cpp:58:26: warning: argument to 'sizeof' in 'void* memset(void*, int, size_t)' call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
     memset(hsh, 0, sizeof(hsh));
                          ^
selling_rna.cpp:61:34: warning: array subscript has type 'char' [-Wchar-subscripts]
         hsh[ob] += st[ob]*(f[s[i]]+1);
                                  ^
selling_rna.cpp: In function 'int query(int, std::__cxx11::string&, int, int)':
selling_rna.cpp:71:22: warning: array subscript has type 'char' [-Wchar-subscripts]
     int c = f[s[idxx]];
                      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 95096 KB Output is correct
2 Correct 81 ms 95156 KB Output is correct
3 Incorrect 81 ms 95096 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1570 ms 207360 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 96440 KB Output is correct
2 Incorrect 103 ms 96632 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 95096 KB Output is correct
2 Correct 81 ms 95156 KB Output is correct
3 Incorrect 81 ms 95096 KB Output isn't correct
4 Halted 0 ms 0 KB -