QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#773155 | #9747. 字符串复制 | Symmetree | RE | 6ms | 21500kb | C++20 | 2.1kb | 2024-11-23 02:21:20 | 2024-11-23 02:21:20 |
Judging History
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...