QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#707921#4375. Stringhejinming983282#AC ✓247ms102004kbC++232.0kb2024-11-03 18:10:542024-11-03 18:10:55

Judging History

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

  • [2024-11-03 18:10:55]
  • 评测
  • 测评结果:AC
  • 用时:247ms
  • 内存:102004kb
  • [2024-11-03 18:10:54]
  • 提交

answer

// Author : hejinming2012
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define dbg(x) cout << #x " = " << (x) << endl
#define quickio ios::sync_with_stdio(false);
#define quickin cin.tie(0);
#define quickout cout.tie(0);
#define maxn 1000005
#define mod 998244353
using namespace std;
inline int read() {
    int now = 0, nev = 1; char c = getchar();
    while(c < '0' || c > '9') { if(c == '-') nev = -1; c = getchar(); }
    while(c >= '0' && c <= '9') { now = (now << 1) + (now << 3) + (c & 15); c = getchar(); }
    return now * nev;
}
void write(int x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
vector <int> G[maxn], dfs;
int n, k, ans, L, R, siz;
int s[maxn], st[maxn], cur[maxn];
int cnt[maxn], pmt[maxn];
char S[maxn];
signed main() {
    quickio
    quickin
    quickout
    int T = read();
    while(T--) {
        scanf("%s%lld", S + 1, &k);
        n = strlen(S + 1), L = 1, R = 0;
        int p = 0; ans = 1;
        for(int i = 0; i <= n; i++)
            G[i].clear();
        for(int i = 0; i <= k; i++)
            cnt[i] = 0;
        G[0].push_back(1);
        for(int i = 2; i <= n; i++) {
            while(p && S[p + 1] != S[i]) p = pmt[p];
            if(S[p + 1] == S[i]) p++;
            pmt[i] = p, G[pmt[i]].push_back(i);
        }
        dfs.clear(), dfs.push_back(0), siz = 1;
        while(siz) {
            int u = dfs.back();
            if(!st[u]) {
                cur[u] = L, s[++R] = u, cnt[2 * u % k]++;
                while(L <= R && 2 * s[L] <= u) cnt[2 * s[L] % k]--, L++;
                ans = ans * (cnt[u % k] + 1) % mod;
                for(auto v : G[u]) dfs.push_back(v), siz++;
                st[u] ^= 1;
            } else {
                while(L > cur[u]) L--, cnt[2 * s[L] % k]++;
                R--, cnt[2 * u % k]--;
                dfs.pop_back(), siz--;
                st[u] ^= 1;
            }
        }
        write(ans), putchar(10);
    }
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 247ms
memory: 102004kb

input:

10
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk...

output:

811844748
106557744
583082277
750875845
539889742
198008691
286657978
344446711
612851418
36100066

result:

ok 10 lines