QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#56438#4375. StringqinjianbinAC ✓649ms161520kbC++171.2kb2022-10-19 16:07:292022-10-19 16:07:29

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-19 16:07:29]
  • 评测
  • 测评结果:AC
  • 用时:649ms
  • 内存:161520kb
  • [2022-10-19 16:07:29]
  • 提交

answer

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;

typedef long long ll;
const int mod = 998244353;
const int N = 1e6 + 10;
vector<int> g[N], q[N];
int Next[N], Next2[N], cnt[N], ans1[N], ans2[N], n, k;
char str[N];

void get_next() 
{
	Next[0] = -1;
	int i = 0, j = -1;
	while(i < n)
	{
		if(j == -1 || str[i] == str[j])
		{
			i++; j++;
			Next[i] = j;
			g[Next[i]].push_back(i);
		}
		else j = Next[j];
	}


	Next2[0] = -1;
	i = 0, j = -1;
	while(i < n)
	{
		if((j == -1 || str[i] == str[j]) && 2 * j + 2 <= i + 1)
		{
			i++; j++;
			Next2[i] = j;
			q[Next2[i]].push_back(i);
		}
		else j = Next[j];
	}
}

void dfs(int u)
{
	cnt[2 * u % k]++;
	ans1[u] = cnt[u % k];
	for(int x: q[u]) ans2[x] = cnt[x % k];
	for(int v: g[u]) dfs(v);
	cnt[2 * u % k]--;
}

int main()
{
	int T; scanf("%d", &T);
	while(T--)
	{
		scanf("%s%d", str, &k);
		n = strlen(str);
		_for(i, 0, n) g[i].clear(), q[i].clear();
		get_next();
		
		dfs(0);

		ll res = 1;
		_for(i, 1, n)
		{
			ll cur = ans1[i] - ans2[i] + 1;
			res = res * cur % mod;
		}
		printf("%lld\n", res);
	}

	return 0; 
} 

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 649ms
memory: 161520kb

input:

10
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk...

output:

811844748
106557744
583082277
750875845
539889742
198008691
286657978
344446711
612851418
36100066

result:

ok 10 lines