제출 #1079192

#제출 시각아이디문제언어결과실행 시간메모리
1079192AndreySelling RNA Strands (JOI16_selling_rna)C++14
100 / 100
1346 ms962924 KiB
#include<bits/stdc++.h>
using namespace std;

vector<vector<int>> trie[2000001];
vector<int> sb[2000001];
vector<int> yo[2000001];
vector<int> idk[2000001];
vector<int> lol[2000001];
vector<string> haha(2000001);
vector<pair<string,string>> query(2000001);
vector<int> ans(2000001);

int wow(char a) {
    if(a == 'A') {
        return 0;
    }
    if(a == 'G') {
        return 1;
    }
    if(a == 'C') {
        return 2;
    }
    if(a == 'U') {
        return 3;
    }
}

void ins(int p, int x, string& s, int d, int br, bool no) {
    if(d >= s.size()) {
        if(br != -1) {
            if(no) {
                yo[x].push_back(br);
            }
            else {
                idk[x].push_back(br);
            }
        }
        sb[p][x]++;
        return;
    }
    int c = wow(s[d]);
    if(trie[p][x][c] == -1) {
        if(!no) {
            return;
        }
        trie[p][x][c] = trie[p].size();
        trie[p].push_back({-1,-1,-1,-1});
        sb[p].push_back(0);
    }
    sb[p][x]-=sb[p][trie[p][x][c]];
    ins(p,trie[p][x][c],s,d+1,br,no);
    sb[p][x]+=sb[p][trie[p][x][c]];
}

int calc(int p, int x, int d, string& s) {
    if(x == -1) {
        return 0;
    }
    if(d == s.size()) {
        return sb[p][x];
    }
    int c = wow(s[d]);
    return calc(p,trie[p][x][c],d+1,s);
}

void dfs(int x, int d) {
    vector<pair<int,int>> wut(0);
    for(int i = 0; i < 4; i++) {
        if(trie[0][x][i] != -1) {
            dfs(trie[0][x][i],d+1);
            wut.push_back({trie[trie[0][x][i]].size(),trie[0][x][i]});
        }
    }
    sort(wut.begin(),wut.end());
    reverse(wut.begin(),wut.end());
    if(wut.size() > 0) {
        swap(trie[x],trie[wut[0].second]);
        swap(lol[x],lol[wut[0].second]);
        swap(sb[x],sb[wut[0].second]);
        for(int i = 1; i < wut.size(); i++) {
            for(int v: lol[wut[i].second]) {
                reverse(haha[v].begin(),haha[v].end());
                ins(x,0,haha[v],0,-1,1);
                reverse(haha[v].begin(),haha[v].end());
                lol[x].push_back(v);
            }
        }
        for(int i = 0; i < wut.size(); i++) {
            trie[wut[i].second].clear();
            lol[wut[i].second].clear();
            sb[wut[i].second].clear();
        }
    }
    for(int i = 0; i < yo[x].size(); i++) {
        int v = yo[x][i];
        reverse(haha[v].begin(),haha[v].end());
        ins(x,0,haha[v],0,-1,1);
        reverse(haha[v].begin(),haha[v].end());
        lol[x].push_back(yo[x][i]);
    }
    for(int v: idk[x]) {
        ans[v] = calc(x,0,0,query[v].second);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n,q;
    cin >> n >> q;
    string s,a,b;
    for(int i = 0; i <= 2000000; i++) {
        trie[i].push_back({-1,-1,-1,-1});
        sb[i].push_back(0);
    }
    trie[0].push_back({-1,-1,-1,-1});
    sb[0].push_back(0);
    for(int i = 0; i < n; i++) {
        cin >> s;
        haha[i] = s;
        ins(0,1,s,0,i,1);
    }
    for(int i = 0; i < q; i++) {
        cin >> a >> b;
        reverse(b.begin(),b.end());
        query[i] = {a,b};
        ins(0,1,a,0,i,0);
    }
    dfs(1,0);
    for(int i = 0; i < q; i++) {
        cout << ans[i] << "\n";
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

selling_rna.cpp: In function 'void ins(int, int, std::string&, int, int, bool)':
selling_rna.cpp:29:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     if(d >= s.size()) {
      |        ~~^~~~~~~~~~~
selling_rna.cpp: In function 'int calc(int, int, int, std::string&)':
selling_rna.cpp:59:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     if(d == s.size()) {
      |        ~~^~~~~~~~~~~
selling_rna.cpp: In function 'void dfs(int, int)':
selling_rna.cpp:80:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |         for(int i = 1; i < wut.size(); i++) {
      |                        ~~^~~~~~~~~~~~
selling_rna.cpp:88:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |         for(int i = 0; i < wut.size(); i++) {
      |                        ~~^~~~~~~~~~~~
selling_rna.cpp:94:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     for(int i = 0; i < yo[x].size(); i++) {
      |                    ~~^~~~~~~~~~~~~~
selling_rna.cpp: In function 'int wow(char)':
selling_rna.cpp:26:1: warning: control reaches end of non-void function [-Wreturn-type]
   26 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...