답안 #1005831

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1005831 2024-06-23T06:45:41 Z Ice_man Selling RNA Strands (JOI16_selling_rna) C++14
0 / 100
106 ms 285524 KB
/**
 ____    ____    ____    __________________    ____    ____    ____
||I ||  ||c ||  ||e ||  ||                ||  ||M ||  ||a ||  ||n ||
||__||  ||__||  ||__||  ||________________||  ||__||  ||__||  ||__||
|/__\|  |/__\|  |/__\|  |/________________\|  |/__\|  |/__\|  |/__\|

*/

#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>

#define maxn 2000005
#define maxlog 20
#define INF 1000000010
#define LINF 1000000000000000005
#define endl '\n'
#define pb(x) push_back(x)
#define X first
#define Y second
#define control cout<<"passed"<<endl;

#pragma GCC optimize("O3" , "Ofast" , "unroll-loops" , "fast-math")
#pragma GCC target("avx2")

using namespace std;


typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef long long ll;
typedef pair <ll , ll> pll;
typedef pair <int , ll> pil;
typedef pair <ll , int> pli;
typedef long double pd;


std::chrono::high_resolution_clock::time_point startT, currT;
constexpr double TIME_MULT = 1;

double timePassed()
{
    using namespace std::chrono;
    currT = high_resolution_clock::now();
    double time = duration_cast<duration<double>>(currT - startT).count();
    return time * TIME_MULT;
}

struct query
{
    int idx;
    int l , r;
    int x;

    query(){};
    query(int _idx, int _l , int _r , int _x)
    {
        idx = _idx;
        l = _l;
        r = _r;
        x = _x;
    }
};

struct Fenwick
{
    vector <int> fenwick;
    int sz;

    void _set(int _sz)
    {
        fenwick.resize(_sz + 1);
        sz = _sz;
    }

    void update(int qpos , int qval)
    {
        for(int i = qpos; i <= sz; i += (i & -i))
            fenwick[i] += qval;
    }

    int query(int qpos)
    {
        int ans = 0;
        for(int i = qpos; i >= 1; i -= (i & -i))
            ans += fenwick[i];
        return ans;
    }
};

int get_num(char c)
{
    if(c == 'A')
        return 0;
    else
        if(c == 'G')
            return 1;
        else
            if(c == 'C')
                return 2;
            else
                return 3; /// U
}


int sz[2] = {1 , 1} , nb[2][maxn][4];
int timer[2] = {0 , 0} , l[2][maxn] , r[2][maxn];

int _find(bool t , string &s)
{
    int node = 0;
    for(char &c : s)
    {
        int id = get_num(c);
        if(nb[t][node][id] == 0)
            return -1;
        node = nb[t][node][id];
    }
    return node;
}


void add(bool t , string &s)
{
    int node = 0;
    for(char &c : s)
    {
        int id = get_num(c);
        if(nb[t][node][id] == 0)
            nb[t][node][id] = sz[t]++;
        node = nb[t][node][id];
    }
}

void dfs(bool t , int node)
{
    l[t][node] = timer[t];
    timer[t]++;

    for(int i = 0; i < 4; i++)
        if(nb[t][node][i] != 0)
            dfs(t , nb[t][node][i]);

    r[t][node] = timer[t];
}


int n , q;
string s[maxn];
string rev[maxn];

void read()
{
    cin >> n >> q;
    for(int i = 0; i < n; i++)
    {
        cin >> s[i];

        add(0 , s[i]);
        rev[i] = s[i];
        reverse(rev[i].begin() , rev[i].end());
        add(1 , rev[i]);
    }

    dfs(0 , 0);
    dfs(1 , 0);
}

vector <int> points[maxn];

void make_points()
{
    for(int i = 0; i < n; i++)
    {
        int pom0 = l[0][_find(0 , s[i])];
        int pom1 = l[1][_find(1 , rev[i])];
        //cout << "-> " << pom1 << " " << pom0 << endl;
        points[pom1].pb(pom0);
    }
}

int ans[maxn];
string su , p;
vector <query> qu[maxn];

void solve()
{
    for(int i = 0; i < q; i++)
    {
        cin >> p >> su;
        reverse(su.begin() , su.end());

        int idp = _find(0 , p);
        int idsu = _find(1 , su);

        if(idp == -1 || idsu == -1)
            continue;

        qu[l[1][idsu]].push_back({i , l[0][idp] , r[0][idp] , -1});
        qu[r[1][idsu]].push_back({i , l[0][idp] , r[0][idp] , 1});
    }

    Fenwick f;
    f._set(maxn);
    for(int i = 1; i < maxn; i++)
    {
        for(int j : points[i - 1])
            f.update(j , 1);

        for(query j : qu[i])
            ans[j.idx] += j.x * (f.query(j.r + 1) - f.query(j.l + 1));
    }

    for(int i = 0; i < q; i++)
        cout << ans[i] << endl;
}




int main()
{

/**#ifdef ONLINE_JUDGE /// promeni
    freopen("taxi.in", "r", stdin);
    freopen("taxi.out", "w", stdout);
#endif*/

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    startT = std::chrono::high_resolution_clock::now();

    read();
    make_points();
    solve();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 39 ms 236116 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 106 ms 285524 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 53 ms 238396 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 39 ms 236116 KB Output isn't correct
2 Halted 0 ms 0 KB -