QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#392247#7876. Cyclic SubstringsiwewTL 769ms312020kbC++201.6kb2024-04-17 12:40:502024-04-17 12:40:51

Judging History

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

  • [2024-04-17 12:40:51]
  • 评测
  • 测评结果:TL
  • 用时:769ms
  • 内存:312020kb
  • [2024-04-17 12:40:50]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 6e6 + 10, M = 24, mod = 998244353;

int n;

namespace PAM {
	struct Node {
		int len, fail, ch[10];
	}pam[N];

	string s;
	int cnt = 2, last = 1, pos = 0;
	void init() {
		s = "$" + s;
		pam[1].len = -1, pam[2].len = 0, pam[2].fail = 1;
	}

	int up(int p) {
		while(s[pos - pam[p].len - 1] != s[pos]) {
			p = pam[p].fail;
		}
		return p;
	}

	int fa[N][M], f[N], dep[N];
	void insert(int ch, int id) {
		pos += 1;
		int p = up(last);
		int &q = pam[p].ch[ch];
		if(q == 0) {
			q = ++ cnt;
			pam[q].len = pam[p].len + 2;
			pam[q].fail = (p == 1 ? 2 : pam[up(pam[p].fail)].ch[ch]);
		}
		last = q;
		
		p = q;
		dep[p] = dep[pam[p].fail] + 1;
		fa[p][0] = pam[p].fail;
		for(int i = 1; (1 << i) <= dep[p]; i ++ ) {
			fa[p][i] = fa[fa[p][i - 1]][i - 1];
		}

		f[p] += 1;
		for(int j = M - 1; j >= 0; j -- ) {
			if((1 << j) <= dep[p] && id - pam[fa[p][j]].len + (pam[fa[p][j]].len > 0) <= n) {
				p = fa[p][j];
			}
		}
		f[fa[p][0]] -= 1;
	}

	ll get_ans() {
		for(int i = cnt; i >= 1; i -- ) {
			f[pam[i].fail] += f[i];
		}

		ll ans = 0;
		for(int i = 1; i <= cnt; i ++ ) {
			if(pam[i].len > 0 && pam[i].len <= n) {
				ll res = 1ll * f[i] * f[i] % mod * pam[i].len % mod;
				ans = (ans + res) % mod;
			}
		}
		return ans;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	string s;
	cin >> n >> s;
	s = s + s;

	PAM::s = s;
	PAM::init();
	for(int i = 0; i < s.length(); i ++ ) {
		PAM::insert(PAM::s[i + 1] - '0', i + 1);
	}
	cout << PAM::get_ans() << '\n';
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 9744kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 1ms
memory: 9764kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 2ms
memory: 9728kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 9744kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 1ms
memory: 10016kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 0ms
memory: 9932kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 1ms
memory: 9772kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 769ms
memory: 312020kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Time Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:


result: