QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#84255#2135. How Many Strings Are LessZuqaWA 20ms106412kbC++173.3kb2023-03-06 05:35:542023-03-06 05:35:55

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-06 05:35:55]
  • 评测
  • 测评结果:WA
  • 用时:20ms
  • 内存:106412kb
  • [2023-03-06 05:35:54]
  • 提交

answer

#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

#define el '\n'
#define FIO ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> pt;
typedef unsigned long long ull;

template<typename T, typename X>
using hashTable = gp_hash_table<T, X>;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

// mt19937_64 for long long
mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());

const int N = 1e6 + 100, LOG = 20;

int sz;
int dp[N][26];
int triee[N][26], up[N][LOG];
int leafs[N], vis[N], ans[N], lvl[N];

void insert(string &s)
{
    int cur = 0;
    for(auto &it: s)
    {
        if(triee[cur][it - 'a'] == -1)
            triee[cur][it - 'a'] = ++sz;
        cur = triee[cur][it - 'a'];
        vis[cur]++;
    }
    leafs[cur]++;
}

void dfs(int trieNode, int smaller)
{
    for(int i = 1; i < LOG; i++)
        up[trieNode][i] = up[up[trieNode][i - 1]][i - 1];

    ans[trieNode] = smaller;
    smaller += leafs[trieNode]; // el 7agat ely bt5ls hena m4 as8r mnk

    for(int c = 0, nxt; c < 26; c++)
    {
        nxt = triee[trieNode][c];
        if(~nxt)
        {
            up[nxt][0] = trieNode;
            lvl[nxt] = lvl[trieNode] + 1;
            dfs(nxt, smaller);
            smaller += vis[nxt];
            dp[trieNode][c] = dp[nxt][c]; // lw el suffix kolo mn awl nxt -> size b2a C, where will trieNode end up
        }
        else
            dp[trieNode][c] = trieNode;
    }

}

int getKthParent(int trieNode, int k)
{
    for(int i = 0; i < LOG; i++)
    {
        if(k >> i & 1)
            trieNode = up[trieNode][i];
    }
    return trieNode;
}

int extra(int trieNode, char nxt)
{
    int ret = leafs[trieNode];
    for(int i = 0; i < nxt - 'a'; i++)
    {
        if(~triee[trieNode][i])
            ret += vis[triee[trieNode][i]];
    }
    return ret;
}

void doWork()
{
    int n, q;
    string in, s;
    cin >> n >> q >> s;
    ::memset(triee, -1, sizeof triee);

    for(int i = 0; i < n; i++)
        cin >> in, insert(in);

    dfs(0, 0);
    int trieNode = 0, sol = 0;
    for(int i = 0; i < s.length(); i++)
    {
        if(~triee[trieNode][s[i] - 'a'])
            trieNode = triee[trieNode][s[i] - 'a'];
        else
            break;
    }

    sol = ans[trieNode];
    if(lvl[trieNode] < s.size())
        sol += extra(trieNode, s[lvl[trieNode]]);
    cout << sol << '\n';
    char c;
    int idx;
    while(q--)
    {
        cin >> idx >> c, idx--;
        if(lvl[trieNode] >= idx)
        {
            int nxt = getKthParent(trieNode, lvl[trieNode] - idx);
            trieNode = dp[nxt][c - 'a'];
            sol = ans[trieNode];
            if(lvl[trieNode] < s.size())
                sol += extra(trieNode, c);
        }
        cout << sol << '\n';
    }

}

signed main()
{
    FIO
    int T = 1;
//    cin >> T;
    for(int i = 1; i <= T; i++)
        doWork();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 17ms
memory: 105948kb

input:

4 3
anatoly
boris
anatooo
anbbbbu
anba
5 o
3 b
7 x

output:

0
0
2
3

result:

ok 4 number(s): "0 0 2 3"

Test #2:

score: 0
Accepted
time: 20ms
memory: 106228kb

input:

5 5
abcde
buz
ababa
build
a
aba
1 b
3 z
2 u
4 z
1 a

output:

3
3
3
4
4
1

result:

ok 6 numbers

Test #3:

score: 0
Accepted
time: 20ms
memory: 106412kb

input:

1 1
abababababababababababab
ababababababababababababab
23 b

output:

0
1

result:

ok 2 number(s): "0 1"

Test #4:

score: -100
Wrong Answer
time: 15ms
memory: 105204kb

input:

4 100
b
dd
ds
ss
sd
1 d
1 s
1 s
1 d
1 s
1 s
1 s
1 s
1 s
1 d
1 s
1 s
1 d
1 d
1 s
1 d
1 d
1 d
1 s
1 d
1 s
1 d
1 s
1 s
1 d
1 d
1 d
1 d
1 s
1 s
1 d
1 s
1 s
1 d
1 d
1 s
1 s
1 s
1 s
1 s
1 s
1 s
1 d
1 d
1 s
1 d
1 s
1 s
1 s
1 s
1 d
1 s
1 s
1 s
1 s
1 s
1 s
1 s
1 d
1 d
1 s
1 d
1 s
1 s
1 d
1 d
1 d
1 d
1 s
1 d
...

output:

0
0
3
3
0
3
3
3
3
3
0
3
3
0
0
3
0
0
0
3
0
3
0
3
3
0
0
0
0
3
3
0
3
3
0
0
3
3
3
3
3
3
3
0
0
3
0
3
3
3
3
0
3
3
3
3
3
3
3
0
0
3
0
3
3
0
0
0
0
3
0
3
3
0
0
3
3
3
0
3
0
0
3
3
3
3
0
0
0
0
3
3
0
3
3
3
3
0
3
3
3

result:

wrong answer 3rd numbers differ - expected: '2', found: '3'