Submission #1079158

#TimeUsernameProblemLanguageResultExecution timeMemory
1079158vnm06Selling RNA Strands (JOI16_selling_rna)C++14
100 / 100
210 ms94336 KiB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;

inline int conv_letter(char c)
{
    if(c=='A') return 0;
    if(c=='C') return 1;
    if(c=='G') return 2;
    return 3;
}

struct vypros
{
    string p, q;
    int nom;

    vypros() {}
};

int n, m;
int ans[100005];
vypros queries[100005];

string s[100005];


int brstates=1;
int states[2000005][4];
int be[2000005], en[2000005];

void addword(int id)
{
    int currstate=1;
    for(int j=s[id].size()-1; j>=0; j--)
    {
        int trns=conv_letter(s[id][j]);
        if(!states[currstate][trns])
        {
            states[currstate][trns]=brstates+1;
            brstates++;
        }
        currstate=states[currstate][trns];
    }
}

int curr_count=1;

void count_states(int pos)
{
    be[pos]=curr_count;
    for(int i=0; i<4; i++)
    {
        if(states[pos][i])
        {
            curr_count++;
            count_states(states[pos][i]);
        }
    }
    en[pos]=curr_count;
}

vector<int> izv[100005];
vector<int> sub[100005];
pair<string, int> trikche[300005];


int fenw[2000005];

int query(int pos)
{
    int res=0;
    while(pos)
    {
        res+=fenw[pos];
        pos-=(pos&(-pos));
    }
    return res;
}

int query(int le, int ri)
{
    return query(ri)-query(le-1);
}

void update(int pos)
{
    while(pos<=brstates)
    {
        fenw[pos]++;
        pos+=(pos&(-pos));
    }
}

int query_suf(int id)
{
    int currstate=1;
    for(int j=queries[id].q.size()-1; j>=0; j--)
    {
        int trns=conv_letter(queries[id].q[j]);
        if(!states[currstate][trns]) return 0;
        currstate=states[currstate][trns];
    }
    ///if(id==4) cout,,
    return query(be[currstate], en[currstate]);
    
}

void update_word(int id)
{
    int currstate=1;
    for(int j=s[id].size()-1; j>=0; j--)
    {
        int trns=conv_letter(s[id][j]);
        currstate=states[currstate][trns];
    }
    update(be[currstate]);
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m;
    for(int i=1; i<=n; i++) cin>>s[i];
    sort(s+1, s+n+1);
    for(int i=1; i<=n; i++) addword(i);
    count_states(1);
    /**for(int i=1; i<=brstates; i++)
    {
        cout<<be[i]<<" "<<en[i]<<endl;
        cout<<states[i][0]<<" "<<states[i][1]<<" "<<states[i][2]<<" "<<states[i][3]<<endl;
    }*/
    for(int i=1; i<=m; i++)
    {
        cin>>queries[i].p>>queries[i].q;
        queries[i].nom=i;
    }
    for(int i=0; i<n; i++) trikche[i]={s[i+1], 1000000000};
    for(int i=0; i<m; i++) 
    {
        trikche[n+2*i]={queries[i+1].p, -(i+1)};
        trikche[n+2*i+1]={queries[i+1].p+'z', i+1};
    }
    sort(trikche, trikche+n+2*m);
    int brdum=0;
    for(int i=0; i<n+2*m; i++)
    {
        //cout<<trikche[i].first<<endl;
        if(trikche[i].second==1000000000) brdum++;
        else if(trikche[i].second<0) izv[brdum].push_back(-trikche[i].second);
        else sub[brdum].push_back(trikche[i].second);
    }
    for(int i=0; i<=n; i++)
    {
        //cout<<"otg "<<ans[4]<<endl;
        //cout<<i<<endl;
        //cout<<"izv: ";
        for(int j=0; j<izv[i].size(); j++) ans[izv[i][j]]-=query_suf(izv[i][j]); //cout<<izv[i][j]<<" ";}
        //cout<<"\nsub: ";
        for(int j=0; j<sub[i].size(); j++) ans[sub[i][j]]+=query_suf(sub[i][j]); //cout<<sub[i][j]<<" ";}
        //cout<<endl;
        if(i==n) break;
        update_word(i+1);
    }
    for(int i=1; i<=m; i++) cout<<ans[i]<<endl;
    return 0;
}

Compilation message (stderr)

selling_rna.cpp: In function 'int main()':
selling_rna.cpp:163:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  163 |         for(int j=0; j<izv[i].size(); j++) ans[izv[i][j]]-=query_suf(izv[i][j]); //cout<<izv[i][j]<<" ";}
      |                      ~^~~~~~~~~~~~~~
selling_rna.cpp:165:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  165 |         for(int j=0; j<sub[i].size(); j++) ans[sub[i][j]]+=query_suf(sub[i][j]); //cout<<sub[i][j]<<" ";}
      |                      ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...