Submission #146394

#TimeUsernameProblemLanguageResultExecution timeMemory
146394osaaateiasavtnlSelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
953 ms580444 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair <int, int>
#define app push_back
#define all(a) a.begin(), a.end()
#define bp __builtin_popcount
#define ll long long
const int N = 1e5 + 7, C = 4;
vector <char> alp = {'A', 'G', 'C', 'U'};
int num(char c) { for (int i = 0; i < C; ++i) if (alp[i] == c) return i; }   
struct Node {
    int sum;
    Node *to[C];
    Node () {
        sum = 0;
        for (int i = 0; i < C; ++i) to[i] = NULL;
    }
};
struct Node1 {
    vector <int> a, q;
    Node1 *to[C];
    Node1 () {
        for (int i = 0; i < C; ++i) to[i] = NULL;
    }
};  
void add(Node *t, vector <int> &a) {
    ++t->sum;
    for (int c : a) {
        if (!t->to[c]) t->to[c] = new Node();
        t = t->to[c];
        ++t->sum;
    }
}
void add(Node1 *t, vector <int> &a, int i) {
    for (int c : a) {
        if (!t->to[c]) t->to[c] = new Node1();
        t = t->to[c];
    }   
    t->a.app(i);
}   
Node *merge(Node *l, Node *r) {
    if (!l) return r; if (!r) return l;
    Node *ans = new Node();
    ans->sum = l->sum + r->sum;
    for (int i = 0; i < C; ++i) ans->to[i] = merge(l->to[i], r->to[i]);
    return ans;
}
int n, m;
vector <int> a[N], l[N], r[N];
int ans[N];
Node* dfs(Node1 *t) {
    if (!t) return NULL;
    Node *res = new Node();
    for (int i : t->a) add(res, a[i]);
    for (int i = 0; i < C; ++i) res = merge(res, dfs(t->to[i]));
    for (int i : t->q) {
        Node *cur = res;
        for (char c : r[i]) {
            if (!cur->to[c]) { cur = NULL; break; }
            cur = cur->to[c];
        }
        if (cur) ans[i] = cur->sum;
    }
    return res;
}
signed main() {
    #ifdef HOME
    freopen("input.txt", "r", stdin);
    #else
    ios_base::sync_with_stdio(0); cin.tie(0);
    #endif
    cin >> n >> m;
    Node1 *root = new Node1();
    for (int i = 0; i < n; ++i) { 
        string s; cin >> s;
        for (char c : s) a[i].app(num(c));
        add(root, a[i], i); 
    }
    for (int i = 0; i < m; ++i) {
        string ls, rs; cin >> ls >> rs;
        for (char c : ls) l[i].app(num(c));
        for (char c : rs) r[i].app(num(c));
        reverse(all(r[i]));
        Node1 *cur = root;
        for (char c : l[i]) {
            if (!cur->to[c]) { cur = NULL; break; }
            cur = cur->to[c];
        }
        if (cur) cur->q.app(i);
    }
    for (int i = 0; i < n; ++i) reverse(all(a[i]));
    dfs(root);
    for (int i = 0; i < m; ++i) cout << ans[i] << '\n';    
}   

Compilation message (stderr)

selling_rna.cpp: In function 'Node* merge(Node*, Node*)':
selling_rna.cpp:42:5: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
     if (!l) return r; if (!r) return l;
     ^~
selling_rna.cpp:42:23: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
     if (!l) return r; if (!r) return l;
                       ^~
selling_rna.cpp: In function 'Node* dfs(Node1*)':
selling_rna.cpp:59:27: warning: array subscript has type 'char' [-Wchar-subscripts]
             if (!cur->to[c]) { cur = NULL; break; }
                           ^
selling_rna.cpp:60:28: warning: array subscript has type 'char' [-Wchar-subscripts]
             cur = cur->to[c];
                            ^
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:86:27: warning: array subscript has type 'char' [-Wchar-subscripts]
             if (!cur->to[c]) { cur = NULL; break; }
                           ^
selling_rna.cpp:87:28: warning: array subscript has type 'char' [-Wchar-subscripts]
             cur = cur->to[c];
                            ^
selling_rna.cpp: In function 'int num(char)':
selling_rna.cpp:10:74: warning: control reaches end of non-void function [-Wreturn-type]
 int num(char c) { for (int i = 0; i < C; ++i) if (alp[i] == c) return i; }   
                                                                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...