답안 #1070631

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1070631 2024-08-22T16:16:33 Z vjudge1 Selling RNA Strands (JOI16_selling_rna) C++17
0 / 100
302 ms 537076 KB
//shikanokonokonokokoshitantan

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;

const bool typetest = 0;
const ll N = 2e5 + 5;
#define inf LLONG_MAX/2
#define bit(x,y) ((x >> y) & 1)
ll sech[N][30];
ll get(ll l, ll r)
{
    ll cnt = 0;
    ll tmp = 1;
    while(tmp * 2 <= r - l)
    {
        tmp *= 2;
        cnt++;
    }
    return min(sech[l + 1][cnt],sech[r - tmp + 1][cnt]);
}
struct node
{
    node* c[26];
   vector<ll> v;
    node()
    {
        for(ll i = 0;i < 26;i++) c[i] = NULL;
    }
};
string a[N];
struct trie
{
    node root;
    void add(string s, ll t)
    {
        ll i = 0;
        node *cur = &root;
        while(i < s.size())
        {

            ll k = s[i] - 'A';
            if(!cur->c[k])
            {
                cur->c[k] = new node();
            }
            cur = cur->c[k];
            cur->v.push_back(t);
            i++;
        }
    }
    ll cal(string x, string s)
    {
        ll i = 0;
        node *cur = &root;
        ll ans = 0;
        while(i < s.size())
        {
            ll k = s[i] - 'A';
            if(!cur->c[k])
            {
                return 0;
            }
            cur = cur->c[k];
            i++;
        }
        ll l = 0, r = cur->v.size() - 1;
        ll k = 0;
        while(true)
        {
            if(l == r)
            {
                k = l;
                break;
            }
            if(l + 1 == r)
            {
                if(a[cur->v[l]] >= x) k = l;
                else k = r;
                break;
            }
            ll mid = (l + r) / 2;
            if(a[cur->v[mid]] >= x) r = mid;
            else l = mid;
        }
        for(i = 0;i < a[cur->v[k]].size() && i < x.size() && a[cur->v[k]][i] == x[i];i++);
        if(i >= x.size())
        {
            ll k1;
            l = 0,r = k;
            while(true)
            {
                if(l == r)
                {
                    k1 = l;
                    break;
                }
                if(l + 1 == r)
                {
                    if(get(l,k) >= x.size()) k1 = l;
                    else k1 = r;
                    break;
                }
                ll mid = (l + r) / 2;
                if(get(mid,k) >= x.size()) r = mid;
                else l = mid;
            }
            ll k2;
            l = k,r = cur->v.size() - 1;
            while(true)
            {
                if(l == r)
                {
                    k2 = l;
                    break;
                }
                if(l + 1 == r)
                {
                    if(get(cur->v[k],cur->v[r]) >= x.size()) k2 = r;
                    else k2 = l;
                    break;
                }
                ll mid = (l + r) / 2;
                if(get(cur->v[k],cur->v[mid]) >= x.size()) l = mid;
                else r = mid;
            }
            return k2 - k1 + 1;
        }else return 0;
    }
};
trie f;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n,q;
    cin >> n >> q;
    ll i,j;
    for(i = 1;i <= n;i++) cin >> a[i];
    sort(a + 1,a + 1 + n);
    for(i = 2;i <= n;i++)
    {
        for(j = 0;j < a[i].size() && j < a[i - 1].size();j++)
        {
            if(a[i][j] == a[i - 1][j]) sech[i][0]++;
            else break;
        }
    }
    for(i = 1;i <= 20;i++)
    {
        for(j = 2;j + (1 << (i - 1)) <= n;j++)
        {
            sech[j][i] = min(sech[j][i - 1],sech[j + (1 << (i - 1))][i - 1]);
        }
    }
    for(i = 1;i <= n;i++)
    {
        reverse(a[i].begin(),a[i].end());
        f.add(a[i],i);
        reverse(a[i].begin(),a[i].end());
    }
    while(q--)
    {
        string pre= "";
        string suf= "";
        cin >> pre >> suf;
        reverse(suf.begin(),suf.end());
        cout << f.cal(pre,suf) << "\n";
    }
}

Compilation message

selling_rna.cpp: In member function 'void trie::add(std::string, ll)':
selling_rna.cpp:43:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |         while(i < s.size())
      |               ~~^~~~~~~~~~
selling_rna.cpp: In member function 'll trie::cal(std::string, std::string)':
selling_rna.cpp:61:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |         while(i < s.size())
      |               ~~^~~~~~~~~~
selling_rna.cpp:90:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |         for(i = 0;i < a[cur->v[k]].size() && i < x.size() && a[cur->v[k]][i] == x[i];i++);
      |                   ~~^~~~~~~~~~~~~~~~~~~~~
selling_rna.cpp:90:48: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |         for(i = 0;i < a[cur->v[k]].size() && i < x.size() && a[cur->v[k]][i] == x[i];i++);
      |                                              ~~^~~~~~~~~~
selling_rna.cpp:91:14: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         if(i >= x.size())
      |            ~~^~~~~~~~~~~
selling_rna.cpp:104:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |                     if(get(l,k) >= x.size()) k1 = l;
      |                        ~~~~~~~~~^~~~~~~~~~~
selling_rna.cpp:109:31: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |                 if(get(mid,k) >= x.size()) r = mid;
      |                    ~~~~~~~~~~~^~~~~~~~~~~
selling_rna.cpp:123:49: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |                     if(get(cur->v[k],cur->v[r]) >= x.size()) k2 = r;
      |                        ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
selling_rna.cpp:128:47: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  128 |                 if(get(cur->v[k],cur->v[mid]) >= x.size()) l = mid;
      |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
selling_rna.cpp:60:12: warning: unused variable 'ans' [-Wunused-variable]
   60 |         ll ans = 0;
      |            ^~~
selling_rna.cpp: In function 'int main()':
selling_rna.cpp:148:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |         for(j = 0;j < a[i].size() && j < a[i - 1].size();j++)
      |                   ~~^~~~~~~~~~~~~
selling_rna.cpp:148:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |         for(j = 0;j < a[i].size() && j < a[i - 1].size();j++)
      |                                      ~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 6744 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 302 ms 537076 KB Output is correct
2 Incorrect 292 ms 509072 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 20816 KB Output is correct
2 Incorrect 28 ms 17496 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 6744 KB Output isn't correct
2 Halted 0 ms 0 KB -