QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#526304#7876. Cyclic Substringsmhw#ML 75ms497232kbC++232.2kb2024-08-21 13:11:352024-08-21 13:11:35

Judging History

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

  • [2024-08-21 13:11:35]
  • 评测
  • 测评结果:ML
  • 用时:75ms
  • 内存:497232kb
  • [2024-08-21 13:11:35]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
#define int long long
#define pii make_pair
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=b;i>=a;--i)
const ll inf = 1145141919810;
using namespace std;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while (c<'0' || c>'9'){
        if (c=='-')  f=-1;
        c=getchar();
    }
    while (c>='0' && c<='9'){
        x=x*10+c-'0';
         c=getchar();
    }
    return x*f;
}
inline void print(ll x){
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) print(x / 10);
	putchar(x % 10 + '0');
	return ;
}
inline void pprint(ll x){print(x); puts("");}

const int N = 6e6 + 7;
struct PAM {
    //���ܶ൫�ǿ����˾�ը
	//ʱ�临�Ӷ�O(n)
	//ע��extent��������
	int t[N];//cnt��ʾ���ִ���
	int tot, lst = 0;
	int fa[N], len[N], tr[N][15], cnt[N], pos[N];
#define sfor(x, i) for(int i = 0; i <= 14; ++i) if(tr[x][i])
	PAM() {
		len[1] = -1, len[0] = 0;
		fa[0] = 1;
		fa[1] = 1;
		tot = 1, lst = 1;
	}
	int getfail(int x, int i) {
		while(t[i - len[x] - 1] != t[i]) {
			x = fa[x];
		}
		return x;
	}
	void extend(int x, int i) { //����ڵ�
		t[i] = x;
		int f = getfail(lst, i);//��Ҫ�����ĸ��ڵ�����
		int j = tr[f][x];
		if(!j) {
			j = ++tot;
			tr[f][x] = j;
			len[j] = len[f]+2;
			int tmp = getfail(fa[f], i);
			if(f != 1) fa[j] = tr[tmp][x];
		}
		lst = j;//����lst
//		cout << lst << endl;
		if(!pos[lst]) pos[lst] = i;
		cnt[lst]++;
	}
	void sum() {
		for(int i = tot; i >= 0; --i) {
			cnt[fa[i]] += cnt[i];
		}
	}
}pam1, pam2;
const ll mod = 998244353;

char s[N];
signed main() {
	int n = read();
	scanf("%s", s + 1);
	for(int i = 1; i <= n; ++i){
		pam1.extend(s[i] - '0' + 1, i);
	}
	for(int i = n + 1; i <= 2 * n; ++i) s[i] = s[i - n];
	for(int i = 1; i <= n * 2; ++i){
		pam2.extend(s[i] - '0' + 1, i);
	}
	ll ans1 = 0, ans2 = 0, ans = 0;

	pam1.sum();
	pam2.sum();


	rep(i, 2, pam2.tot){

		if(pam2.len[i] > n) continue;
		ll cnt = pam2.cnt[i] - pam1.cnt[i];
		ans = 1ll * (ans + 1ll * pam2.len[i] * cnt % mod * cnt % mod) % mod;
	}

	pprint(ans % mod);
}
/*
5
01010
*/
/*
8
00110011
*/
/*
3
000
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 20000kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 3ms
memory: 20224kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

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

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

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

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

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

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

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

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 75ms
memory: 497232kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Memory Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result: