QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#56438 | #4375. String | qinjianbin | AC ✓ | 649ms | 161520kb | C++17 | 1.2kb | 2022-10-19 16:07:29 | 2022-10-19 16:07:29 |
Judging History
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