QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#273828#7876. Cyclic Substringsucup-team2000#WA 215ms911636kbC++201.9kb2023-12-03 04:34:172023-12-03 04:34:18

Judging History

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

  • [2023-12-03 04:34:18]
  • 评测
  • 测评结果:WA
  • 用时:215ms
  • 内存:911636kb
  • [2023-12-03 04:34:17]
  • 提交

answer

#include <bits/stdc++.h>

template<int MAXN = 4500000, int MAXC = 10>
struct palindromic_tree {
	struct node {
		node *child[MAXC], *fail; int len;
		node(int len = 0) : fail(NULL), len(len) {
			memset(child, NULL, sizeof(child)); }
	} node_pool[MAXN * 2], *tot_node;
	int size, text[MAXN * 2];
	node *odd, *even, *last;
	node *match(node *now) {
		for (; text[size - now -> len - 1] != text[size]; now = now -> fail);
		return now; }
	bool extend(int token) {
		text[++size] = token; node *now = match(last);
		if (now -> child[token])
			return last = now -> child[token], false;
		if (tot_node == node_pool + MAXN * 2) while (true);
		last = now -> child[token] = new (tot_node++) node(now -> len + 2);
		if (now == odd) last -> fail = even;
		else {
			now = match(now -> fail);
			last -> fail = now -> child[token]; }
		return true; }
	void init() {
		text[size = 0] = -1; tot_node = node_pool;
		last = even = new(tot_node++) node(0); odd = new(tot_node++) node(-1);
		even -> fail = odd; }
	palindromic_tree() { init(); } };

const int MOD = 998244353;

palindromic_tree<> _p;
int N;
char str[3000001];
int sum1[6000000], sum2[6000000];

int main() {
	scanf("%d", &N);
	scanf(" %s", str);
	for (int i = 0; i < N; ++i) {
		_p.extend(str[i] - '0');
		++sum1[_p.last - _p.node_pool];
		++sum2[_p.last - _p.node_pool];
	}
	for (int i = _p.tot_node - _p.node_pool - 1; i >= 0; --i) {
		if (_p.node_pool[i].fail)
			sum1[_p.node_pool[i].fail - _p.node_pool] += sum1[i];
	}
	for (int i = 0; i < N; ++i) {
		_p.extend(str[i] - '0');
		++sum2[_p.last - _p.node_pool];
	}
	int ans2 = 0;
	for (int i = _p.tot_node - _p.node_pool - 1; i >= 0; --i) {
		if (_p.node_pool[i].fail)
			sum2[_p.node_pool[i].fail - _p.node_pool] += sum2[i];
		int f = _p.node_pool[i].len;
		if (f > 0 && f <= N) {
			ans2 = (ans2 + 1ll * (sum2[i] - sum1[i]) * (sum2[i] - sum1[i]) % MOD * f) % MOD;
		}
	}
	printf("%d\n", ans2);
}


Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 52ms
memory: 853780kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 47ms
memory: 853868kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 36ms
memory: 853832kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 56ms
memory: 853872kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 35ms
memory: 853728kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 60ms
memory: 853768kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 47ms
memory: 853884kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 108ms
memory: 875888kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Wrong Answer
time: 215ms
memory: 911636kb

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

30360638

result:

wrong answer 1st numbers differ - expected: '890701718', found: '30360638'