제출 #849665

#제출 시각아이디문제언어결과실행 시간메모리
849665alexddSelling RNA Strands (JOI16_selling_rna)C++17
100 / 100
306 ms452176 KiB
#include<bits/stdc++.h>
using namespace std;
const long long MOD = 1e9+7;
const int cst = 31;
int n,m;
vector<int> trie[2000005];
int mch[2000005][26];
vector<int> trie2[2000005];
int mch2[2000005][26];
int rez[100005];
int cnt,cnt2;
int poze[2000005],timer=0;
int siz[2000005];
int op[100005];
int mp[2000005];
vector<pair<pair<int,int>,int>> qrys[100005];
vector<int> pozs[100005];
void dfs(int nod)
{
    poze[nod]=++timer;
    siz[nod]=1;
    for(auto adj:trie[nod])
    {
        dfs(adj);
        siz[nod]+=siz[adj];
    }
}
int v[2000005];
void solve(int suff)
{
    int cntv=0;
    sort(pozs[suff].begin(),pozs[suff].end());
    for(auto x:qrys[suff])
        rez[x.second] = upper_bound(pozs[suff].begin(),pozs[suff].end(),x.first.second) - lower_bound(pozs[suff].begin(),pozs[suff].end(),x.first.first);
}
int ult[100005];
string cit[100005];
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m;
    string s,p,q;
    for(int i=1;i<=n;i++)
    {
        cin>>s;
        cit[i]=s;
        int nod=0;
        for(int j=0;j<s.size();j++)
        {
            if(mch[nod][s[j]-'A']==0)
            {
                cnt++;
                mch[nod][s[j]-'A']=cnt;
                trie[nod].push_back(cnt);
            }
            nod=mch[nod][s[j]-'A'];
        }
        ult[i]=nod;
    }
    dfs(0);
    for(int i=1;i<=m;i++)
    {
        cin>>p>>q;
        int nod=0;
        bool bl=0;
        for(int j=0;j<p.size();j++)
        {
            if(mch[nod][p[j]-'A']==0)
            {
                bl=1;
                break;
            }
            nod=mch[nod][p[j]-'A'];
        }
        if(!bl)
        {
            int nod2=0;
            for(int j=q.size()-1;j>=0;j--)
            {
                if(mch2[nod2][q[j]-'A']==0)
                {
                    cnt2++;
                    mch2[nod2][q[j]-'A']=cnt2;
                    trie2[nod2].push_back(cnt2);
                }
                nod2=mch2[nod2][q[j]-'A'];
            }
            ///qrys[nod].push_back({curaux,i});
            if(mp[nod2]==0) mp[nod2]=i;
            op[i]=nod2;
            qrys[mp[nod2]].push_back({{poze[nod],poze[nod]+siz[nod]-1},i});
        }
    }
    for(int i=1;i<=n;i++)
    {
        s=cit[i];
        int nod2=0;
        for(int j=s.size()-1;j>=0;j--)
        {
            if(mch2[nod2][s[j]-'A']==0)
            {
                cnt2++;
                mch2[nod2][s[j]-'A']=cnt2;
                trie2[nod2].push_back(cnt2);
            }
            nod2=mch2[nod2][s[j]-'A'];
            if(mp[nod2]!=0) pozs[mp[nod2]].push_back(poze[ult[i]]);
        }
    }
    for(int i=m;i>0;i--)
    {
        if(mp[op[i]]==i)
        {
            solve(i);
        }
    }
    for(int i=1;i<=m;i++)
        cout<<rez[i]<<"\n";
    return 0;
}

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

selling_rna.cpp: In function 'void solve(int)':
selling_rna.cpp:31:9: warning: unused variable 'cntv' [-Wunused-variable]
   31 |     int cntv=0;
      |         ^~~~
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:48:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |         for(int j=0;j<s.size();j++)
      |                     ~^~~~~~~~~
selling_rna.cpp:66:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for(int j=0;j<p.size();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...