稍等
把这份代码扔给了 DeepSeek,它竟一眼看出了我的做法
额呃呃
谁来参加一下,宣
知道我问题在哪了, k 个子串不仅仅包含前后缀,还有种可能就是 abc|d|efg
这种
你来帮忙调一下吧
参加了
???我记得我给你过一题……
@览遍千秋 你看一下这个公开赛模板行不行? 「MTOI」Round 1(现在请不要报名) - 洛谷 | 计算机科学教育新生态
缺了一张头图
@览遍千秋 我不会做头图 qwq
。。。你设的是自己可见,我看不到!!!
@览遍千秋 其他的可以吗?
@2345安全卫士 怎么制作?
DeepSeek 帮忙调的代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int fac[300005], inv[300005], len, ans;
unsigned long long hashp[300005], hashb[300005], pw[300005];
unordered_map<unsigned long long, int> hs_t;
string s;
int qpow(int x, int y) {
int res = 1;
while (y) {
if (y & 1) res = res * x % mod;
x = x * x % mod;
y >>= 1;
}
return res;
}
void init() {
fac[0] = 1;
for (int i = 1; i <= 300000; i++) fac[i] = fac[i - 1] * i % mod;
inv[300000] = qpow(fac[300000], mod - 2);
for (int i = 299999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
pw[0] = 1;
for (int i = 1; i <= len; i++) pw[i] = pw[i - 1] * 131;
for (int i = 1; i <= len; i++) hashp[i] = hashp[i - 1] * 131 + s[i];
for (int i = len; i >= 1; i--) hashb[i] = hashb[i + 1] * 131 + s[i];
}
unsigned long long gethash1(int l, int r) {
return hashp[r] - hashp[l - 1] * pw[r - l + 1];
}
unsigned long long gethash2(int l, int r) {
return hashb[l] - hashb[r + 1] * pw[r - l + 1];
}
signed main() {
cin >> s;
len = s.size(); s = ' ' + s;
init();
for (int i = 1; i <= len; i++) {
hs_t.clear();
int k = len / i;
for (int j = 1; j <= k; j++) {
int st = i * (j - 1) + 1, ed = st + i - 1;
hs_t[gethash1(st, ed)]++;
}
int res = fac[k];
for (auto x : hs_t) res = res * inv[x.second] % mod;
if (len % i != 0) {
hs_t.clear();
int bk = len - k * i + 1;
for (int j = 1; j <= k; j++) {
int st = bk + (j - 1) * i, ed = st + i - 1;
hs_t[gethash1(st, ed)]++;
}
int res2 = fac[k];
for(auto x : hs_t) res2 = res2 * inv[x.second] % mod;
ans = (ans + res + res2) % mod;
} else ans = (ans + res) % mod;
}
cout << ans;
return 0;
}
样例二依旧过不去
@览遍千秋 这些我都知道,我都预留位置写好了,人选还没有确定