QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#773155#9747. 字符串复制SymmetreeRE 6ms21500kbC++202.1kb2024-11-23 02:21:202024-11-23 02:21:20

Judging History

This is the latest submission verdict.

  • [2024-11-23 02:21:20]
  • Judged
  • Verdict: RE
  • Time: 6ms
  • Memory: 21500kb
  • [2024-11-23 02:21:20]
  • Submitted

answer

#include<bits/stdc++.h>
using i64 = long long;
const int N = 3e5+5, mod = 998244353;
char s[N * 3];
int n, m, len, rk[N * 6], oldrk[N * 3], sa[N * 6], height[N * 3], id[N * 3], cnt[N];
void SA() {
  int m = 128, p;
  memset(cnt, 0, sizeof cnt);
  memset(rk, 0, sizeof rk);
  for (int i = 1; i <= len; i++) cnt[rk[i] = s[i]]++;
  for (int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
  for (int i = len; i >= 1; i--) sa[cnt[rk[i]]--] = i;

  for (int w = 1;; w <<= 1, m = p) { 
    int cur = 0;
    for (int i = len - w + 1; i <= len; i++) id[++cur] = i;
    for (int i = 1; i <= len; i++)
      if (sa[i] > w) id[++cur] = sa[i] - w;

    memset(cnt, 0, sizeof(cnt));
    for (int i = 1; i <= len; i++) cnt[rk[i]]++;
    for (int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
    for (int i = len; i >= 1; i--) sa[cnt[rk[id[i]]]--] = id[i];

    p = 0;
    memcpy(oldrk, rk, sizeof(oldrk));
    for (int i = 1; i <= len; i++) {
      if (oldrk[sa[i]] == oldrk[sa[i - 1]] && oldrk[sa[i] + w] == oldrk[sa[i - 1] + w])
        rk[sa[i]] = p;
      else
        rk[sa[i]] = ++p;
    }
    if (p == len) break;
  }
}
inline i64 solve() {
    SA();
    for (int i = 1, k = 0; i <= len; ++i) {
      if (rk[i] == 0) continue;
      if (k) --k;
      while (s[i + k] == s[sa[rk[i] - 1] + k]) ++k;
      height[rk[i]] = k;
    }
    i64 ans = 1ll * len * (len + 1) / 2;
    // for(int i = 1; i <= len; ++i) printf("%d ", height[rk[i]]); puts("");
    for(int i = 2; i <= len; ++i) ans -= height[i];
    return ans;
}
signed main() {
    scanf("%d%d%s", &n, &m, s + 1);
    // for(int i = 1; i <= n * 3; ++i) pw[i] = pw[i - 1] * base;
    for(int i = 1; i <= n; ++i) s[i + n] = s[i + 2 * n] = s[i];
    // for(int i = 1; i <= n * 3; ++i) hash[i] = hash[i - 1] * base + (s[i] - 'a');
    if(m <= 3) {
        len = n * m;
        s[len + 1] = 0;
        printf("%lld\n", solve() % mod);
        return 0;
    }
    int res2, res3;
    len = 3 * n, res3 = solve() % mod;
    s[2 * n + 1] = 0;
    len = 2 * n, res2 = solve() % mod;
    printf("%lld\n", (res2 + 1ll * (res3 - res2 + mod) % mod * (m - 2) % mod) % mod);
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 21500kb

input:

6 2
mantle

output:

57

result:

ok single line: '57'

Test #2:

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

input:

12 1919810
ifamjlifamjl

output:

138226305

result:

ok single line: '138226305'

Test #3:

score: 0
Accepted
time: 6ms
memory: 21392kb

input:

13 935330878
aabbbbababbaa

output:

348310505

result:

ok single line: '348310505'

Test #4:

score: -100
Runtime Error

input:

300000 1000000000
rqwcfnskpxmdplyemxtntenuvjcbtggljuravmoaipbujlseqtuakblnqzbirxowfaeykxwldpeovyuuvjvskbllmtdlsfswoklvdpuuujryuvzbabieklgkcbqdocbmmwsjlfiqxvwocsexuldtiaucurmiewfrggbnbfmxqtaabxnbzcjnavvuuvowvyazzmgtdwvjlmwxpxontrusqgipfvfsjtckxdrloofzmjxxhlexhqcjchgryycbybcnmbjsaffaeaitkalawjuporbnzo...

output:


result: