P7114 [NOIP2020] 字符串匹配 (哈希)
看到循环部分
我们先思考找到右端点怎么计算贡献。最朴素的,我们再枚举前缀
看到题解关于复杂度的一个结论
我们直接枚举比倍增还快,这样代码变简单,复杂度降为
我们考虑如何简化贡献的计算,发现对于后缀
复杂度为
#include <bits/stdc++.h>
typedef long long ll;
int read() {
int x = 0, f = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -1;
c = getchar();
}
while(isdigit(c)) {
x = (x << 3) + (x << 1) + (c - '0');
c = getchar();
}
return x * f;
}
const ll p = 1331, mod = 13333331;
ll t, n, h[2000010], pw[2000010], suf[2000010], vis[30], ans, c[30];
char s[2000010];
ll hsh(int l, int r) {
return (h[r] - h[l - 1] * pw[r - l + 1] % mod + mod) % mod;
}
ll lowbit(ll x) {
return x & (-x);
}
void update(int x, ll y) {
for(int i = x; i <= 27; i += lowbit(i)) {
c[i] += y;
}
}
ll query(int x) {
ll ret = 0;
for(int i = x; i; i -= lowbit(i)) {
ret += c[i];
}
return ret;
}
void Solve() {
t = read();
pw[0] = 1;
for(int i = 1; i <= 2000000; i++) {
pw[i] = pw[i - 1] * p % mod;
}
while(t--) {
ans = 0;
std::cin >> s + 1;
n = strlen(s + 1);
for(int i = 1; i <= n; i++) {
h[i] = (h[i - 1] * p + s[i]) % mod;
}
int now = 0;
memset(vis, 0, sizeof(vis));
memset(c, 0, sizeof(c));
for(int i = n; i >= 1; i--) {
vis[s[i] - 'a']++;
if(vis[s[i] - 'a'] % 2 == 1) now++;
else now--;
suf[i] = now;
}
memset(vis, 0, sizeof(vis));
now = 0;
for(int i = 1; i < n; i++) {
int r = i;
for(int j = i; j <= n; j += i) {
// std::cout << i << " " << j << " " << h[i] << " " << hsh(j - i + 1, j) << "\n";
if(h[i] != hsh(j - i + 1, j) || j == n) {
break;
}
else r = j;
}
// std::cout << i << " " << r << " ";
int res1 = query(suf[r + 1] + 1), res2 = query(suf[r - i + 1] + 1);
// std::cout << res1 << "\n";
if(i != 1) {
if(r / i == 1) {
ans += res1;
}
else {
if(((r / i) % 2) == 0) {
ans += (r / i / 2) * res1;
}
else ans += (r / i / 2 + 1) * res1;
if(((r / i + 1) % 2) == 0) {
ans += ((r / i + 1) / 2 - 1) * res2;
}
else ans += ((r / i + 1) / 2) * res2;
}
}
// std::cout << r << "\n";
vis[s[i] - 'a']++;
if(vis[s[i] - 'a'] % 2 == 1) now++;
else now--;
update(now + 1, 1);
}
std::cout << ans << "\n";
}
}
int main() {
Solve();
return 0;
}
标签:
哈希
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具