QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#549402 | #9111. Zayin and String | wangyangjena | AC ✓ | 1080ms | 101080kb | C++14 | 2.8kb | 2024-09-06 15:09:13 | 2024-09-06 15:09:13 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
#define double long double
#pragma GCC optimize(2)
using namespace std;
const int N = 1e5 + 10, MOD = 998244353, INF = 1e9;
const double eps = 1e-17;
int Q_pow(int a, int b){
int ans = 1, p = a;
while(b){
if(b & 1) ans = (ans * p) % MOD;
b >>= 1;
p = (p * p) % MOD;
}
return ans;
}
int t;
int n, m, val;
string s, ss;
struct Node{
int son[26];
int fail, ed;
}tr[N];
int cnt, sum[N], v[N][26];
queue <int> q;
void Insert(string s, int v){
int p = 0;
for(auto i : s){
int ch = i - 'a';
if(!tr[p].son[ch]) tr[p].son[ch] = ++cnt;
p = tr[p].son[ch];
}
tr[p].ed += v;
}
void Get_fail(){
for(int i = 0; i < 26; i++){
if(tr[0].son[i]){
q.push(tr[0].son[i]);
}
}
while(!q.empty()){
int tp = q.front();
q.pop();
sum[tp] = sum[tr[tp].fail] + tr[tp].ed;
for(int i = 0; i < 26; i++){
if(tr[tp].son[i]){
tr[tr[tp].son[i]].fail = tr[tr[tp].fail].son[i];
q.push(tr[tp].son[i]);
}else{
tr[tp].son[i] = tr[tr[tp].fail].son[i];
}
}
}
}
double f[1001][4001];
int dp[1001][4001], len[1001][4001];
bool Check(double lim){
for(int i = 0; i <= n; i++){
for(int j = 0; j <= cnt; j++){
f[i][j] = -INF;
dp[i][j] = 0;
len[i][j] = 0;
}
}
f[0][0] = 0;
dp[0][0] = 0;
len[0][0] = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j <= cnt; j++){
f[i + 1][j] = f[i][j];
dp[i + 1][j] = dp[i][j];
len[i + 1][j] = len[i][j];
}
for(int j = 0; j <= cnt; j++){
int ch = s[i] - 'a';
int to = tr[j].son[ch];
if(!to) continue;
if(f[i + 1][to] + eps < f[i][j] + sum[to] - lim){
f[i + 1][to] = f[i][j] + sum[to] - lim;
dp[i + 1][to] = dp[i][j] + sum[to];
len[i + 1][to] = len[i][j] + 1;
}
}
}
for(int i = 1; i <= cnt; i++){
if(f[n][i] >= 0){
// printf("%.4Lf\n", f[n][i]);
return 1;
}
}
return 0;
}
signed main(){
// freopen("1.in", "r", stdin);
cin >> t;
while(t--){
cin >> n >> m >> s;
for(int i = 1; i <= m; i++){
cin >> ss >> val;
Insert(ss, val);
}
Get_fail();
// for(int i = 0; i <= cnt; i++){
// cout << sum[i] << " ";
// }
// cout << "\n";
double l = 0, r = 2e8, ans = 0;
for(int i = 1; i <= 50; i++){
double mid = (l + r) / 2;
if(Check(mid)){
ans = mid;
l = mid + 1;
}else{
r = mid - 1;
}
}
// printf("%.4Lf\n", ans);
Check(ans);
for(int i = 1; i <= cnt; i++){
if(f[n][i] >= 0){
int ret = dp[n][i] * Q_pow(len[n][i], MOD - 2) % MOD;
cout << ret << "\n";
break;
}
}
for(int i = 0; i <= cnt; i++){
memset(tr[i].son, 0, sizeof(tr[i].son));
tr[i].ed = tr[i].fail = 0;
sum[i] = 0;
}
cnt = 0;
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 918ms
memory: 90348kb
input:
80 4 7 ggeg g 92946 d 65678 gg 50828 wrj 93954 gge 53780 a 94179 geg 40837 5 6 hiiii ii 67984 foh 69185 hi 88153 pj 39431 i 32219 wfmve 96834 8 12 wvxxvwww xw 1522 rzl 16262 wx 77596 v 69622 vw 82225 nykkmkv 19236 xv 83470 o 16781 w 2405 m 98319 ww 13889 qggbvty 16331 8 14 jjjiiijh i 96670 z 74397 i...
output:
332874949 599030808 249640519 332898173 665548146 81272 61572 67112 499196918 748779217 88888 831949361 74929 665552405 499139737 665543594 332830174 60785 748771076 63646 103574 101389 432700990 332787384 249703944 89874 110460 499215461 665540622 41750 782592345 96189 111031999 94537 83443 111657 ...
result:
ok 80 lines
Test #2:
score: 0
Accepted
time: 853ms
memory: 63800kb
input:
80 6 9 ffdffd df 5764 g 80673 dfd 93960 sje 2655 f 52989 dykez 24524 fd 93464 v 5951 dd 80386 4 8 hgig hi 36540 eoy 56555 hgi 16024 da 39472 i 11615 w 28388 h 13233 b 36396 3 6 jhh jhh 78310 jck 52810 h 93391 f 84166 j 58232 tixuja 90170 6 9 wvuuwu uu 18802 cto 64653 v 17516 e 89244 vu 7176 yb 35851...
output:
499220334 30694 665604010 28868 499155869 399434929 43201 55925 53130 665596997 112603 48316 51377 665595637 332817598 92435 332790461 199775438 118514 46654 98424 99849 468077048 33082 499180262 499161147 99170 49530 249661952 665599894 19760011 31724 125134 665598061 665568382 53270 57347 74873729...
result:
ok 80 lines
Test #3:
score: 0
Accepted
time: 1007ms
memory: 99028kb
input:
80 6 9 fdfdfd f 62278 bd 63301 d 82508 hyx 79679 fd 77199 gat 3304 dd 38771 sz 65675 ffd 39030 3 4 ihi i 23765 vum 4334 ihi 35317 jz 58824 7 12 nmnnnmn mm 53554 z 37003 nnm 93166 os 47375 n 91295 k 23069 mn 70863 ke 53536 nmm 79577 xx 80568 nnn 9319 xpoioy 49090 3 4 stu su 64015 pm 39855 stu 12774 g...
output:
249677224 665523851 499231655 499154184 95658 332794463 499226034 748789158 80649 144255 249638234 499158453 48294 249637902 90840 499168402 499173301 499254931 599034136 249676514 332790820 798677117 102014068 332796115 44767 96925 120384 499168015 88966 99986 27092909 66644 832034701 125185 332785...
result:
ok 80 lines
Test #4:
score: 0
Accepted
time: 1080ms
memory: 101080kb
input:
80 7 12 jihijhj i 72948 zl 98729 hjh 84734 r 57189 hh 75314 yn 6123 jh 73861 u 47490 jhj 86000 vi 60571 j 69646 rzeaekb 51127 3 6 rrr r 47818 c 7921 rr 7750 aq 79014 rrr 28438 igv 43270 6 8 jkijkj k 23174 xs 49356 j 68561 xw 31342 kk 97855 flt 49385 kij 10232 xy 84681 6 8 klkmml kl 29970 chw 4110 lk...
output:
399420420 62464 499194278 499164004 665521173 499197753 332808457 44186 665604467 97158 831965037 665545040 665623667 97887 665633265 58787 249631705 90776 332775392 75134 18376 798687225 25718328 332778936 47597 121972 44629 665528383 499213995 748819760 73157720 80450 698915455 249699722 499140797...
result:
ok 80 lines
Test #5:
score: 0
Accepted
time: 1019ms
memory: 78180kb
input:
80 3 4 bbb b 44630 kt 93484 bb 29609 ps 66781 6 8 ttttut ttu 29879 lh 47140 tu 38786 lel 2159 ttt 63824 e 42744 tt 84477 a 135 8 13 qqqqqpoo po 18783 pt 34823 qpo 1940 mh 66501 qq 68822 tdr 21257 o 59431 fxh 58424 q 18175 or 99541 p 43971 tqnmjr 34605 qqq 92858 4 8 uwvv v 86612 ig 38634 uv 21955 c 5...
output:
332812487 105876 199777818 102222 70120 332840767 79049 332835764 54271 99337 460834412 665570126 56347 99619 30473 499283122 499229142 499208844 49412 665558243 748735960 332866356 737994449 499188739 499230438 34815 332868289 665538255 332834232 94334 244225146 499231229 844832371 199748229 108136...
result:
ok 80 lines