QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#84255 | #2135. How Many Strings Are Less | Zuqa | WA | 20ms | 106412kb | C++17 | 3.3kb | 2023-03-06 05:35:54 | 2023-03-06 05:35:55 |
Judging History
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();
}
详细
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'