QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#621611#9111. Zayin and StringSGColinAC ✓331ms75016kbC++203.2kb2024-10-08 15:39:312024-10-08 15:39:32

Judging History

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

  • [2024-10-08 15:39:32]
  • 评测
  • 测评结果:AC
  • 用时:331ms
  • 内存:75016kb
  • [2024-10-08 15:39:31]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

#define eb emplace_back
#define all(s) (s).begin(), (s).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)

const int N = 4007;
const int M = 1007;
const int mod = 998244353;

template<typename T>
inline bool getmax(T &a, T b) {return (a < b ? (a = b, true) : false);}

inline int fpow(int x, int t = mod - 2) {
	int res = 1;
	for (; t; t >>= 1, x = 1ll * x * x % mod)
		if (t & 1) res = 1ll * res * x % mod;
	return res;
}

const double eps = 1e-8;

struct Trie_Graph {
	int rt = 0, cnt = 0, fail[N];
	int son[N][26], nxt[N][26];
	// son = structure of the Trie
	// nxt = fill the trie in to trie graph
	int w[N];
	void reset() {
		rt = cnt = 0;
		memset(son[0], 0, sizeof(son[0]));
		memset(nxt[0], 0, sizeof(nxt[0]));
	}
	int newnode() {
		++cnt;
		fail[cnt] = w[cnt] = 0;
		memset(son[cnt], 0, sizeof(son[cnt]));
		memset(nxt[cnt], 0, sizeof(nxt[cnt]));
		return cnt;
	}
	int insert(int pre, int ch) {
		return son[pre][ch] ? son[pre][ch] : son[pre][ch] = newnode();
	}
	void insert(string &S) {
		int nw = rt;
		for (auto &ch : S) nw = insert(nw, ch - 'a');
		cin >> w[nw];
	}
	void build() {
		queue<int> Q;
		Q.push(rt);
		memcpy(nxt[rt], son[rt], sizeof(son[rt]));
		while (!Q.empty()) {
			int u = Q.front(); Q.pop();
			rep(ch, 0, 25) {
				int v = son[u][ch];
				if (!v) continue; 
				fail[v] = (u == 0 ? 0 : nxt[fail[u]][ch]);
				w[v] += w[fail[v]];
				memcpy(nxt[v], nxt[fail[v]], sizeof(nxt[v]));
				rep(cc, 0, 25) if (son[v][cc]) nxt[v][cc] = son[v][cc];
				Q.push(v);
			}
		}
	}

	double mx[M][N];

	int cur[M][N];

	pii pre[M][N], anspos;

	inline bool check(double val, string &S) {
		mx[0][rt] = cur[0][rt] = 0;
		rep(i, 1, cnt) mx[0][i] = -1e18, cur[0][i] = 0, pre[0][i] = {0, 0};
		int pos = 0;
		for (auto &ch : S) {
			int x = ch - 'a';
			rep(u, 0, cnt) {
				mx[pos + 1][u] = mx[pos][u];
				cur[pos + 1][u] = cur[pos][u];
				pre[pos + 1][u] = pre[pos][u];
			}
			rep(u, 0, cnt) {
				int v = nxt[u][x];
				if (getmax(mx[pos + 1][v], mx[pos][u] + w[v] - val)) {
					cur[pos + 1][v] = pos + 1;
					pre[pos + 1][v] = {cur[pos][u], u};
					if (mx[pos + 1][v] > eps) {anspos = {pos + 1, v}; return true;}
				}
			}
			++pos;
		}
		return false;
	}

	inline int run(string &S) {
		int sum = 0, nw = rt;
		for (auto &ch : S) {
			nw = nxt[nw][ch - 'a'];
			sum = (sum + w[nw]) % mod;
		}
		return 1ll * sum * fpow(S.length()) % mod;
	}

} tg;

inline void work() {
	
	tg.reset();
	int n, m; cin >> n >> m;
	string S, T; cin >> S;
	rep(i, 1, m) {cin >> T; tg.insert(T);}
	tg.build();

	double l = 0, r = 1e8;
	while (r - l > eps) {
		double mid = (l + r) / 2;
		tg.check(mid, S) ? l = mid : r = mid;
	}
	tg.check(l, S);

	int sum = 0, len = 0;
	auto [pos, cur] = tg.anspos;
	do {
		++len;
		sum = (sum + tg.w[cur]) % mod;
		auto [_pos, _cur] = tg.pre[pos][cur];
		swap(pos, _pos);
		swap(cur, _cur);
	} while (pos);

	cout << 1ll * sum * fpow(len) % mod << endl;
}

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	int t; cin >> t;
	while (t--) work();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 296ms
memory: 68176kb

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: 286ms
memory: 58036kb

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: 304ms
memory: 70508kb

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: 331ms
memory: 75016kb

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: 307ms
memory: 65928kb

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