当前位置: 首页 > news >正文

洛谷P4173 残缺的字符串 题解 卷积解决带通配符字符串匹配问题

题目链接:https://www.luogu.com.cn/problem/P4173

解题思路:完全来自 Ebola大佬的博客
(理解了思路,自己手推了一下)

最后的式子用 FFT 求卷积。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 5;
using cd = complex<double>;
const double PI = acos(-1);void fft(vector<cd>&a, int type) {int n = a.size();if (n == 1) return;vector<cd> a0(n/2), a1(n/2);for (int i = 0; i < n/2; i++) {a0[i] = a[i * 2];a1[i] = a[i * 2 + 1];}fft(a0, type);fft(a1, type);cd wn(cos(2 * PI / n), type * sin(2 * PI / n));cd w(1, 0);for (int k = 0; k < n/2; k++) {cd t = w * a1[k];a[k] = a0[k] + t;a[k + n/2] = a0[k] - t;w *= wn;}
}int m, n, a[maxn], b[maxn], limit = 1;
char s[maxn], t[maxn];int query(int a[], int l, int r) {int res = a[r];if (l) res -= a[l-1];return res;
}vector<int> res;
double ans[maxn];bool check(int x) {long long res = 0;for (int i = 0; i < m; i++)res += a[i] * a[i] * a[i] * b[i+x]+ a[i] * b[i+x] * b[i+x] * b[i+x]- 2 * a[i] * a[i] * b[i+x] * b[i+x];return res == 0;
}int main() {scanf("%d%d%s%s", &m, &n, s, t);for (int i = 0; i < m; i++) {if (s[i] == '*')a[i] = 0;elsea[i] = s[i] - '0' + 1;}for (int i = 0; i < n; i++) {if (t[i] == '*')b[i] = 0;elseb[i] = t[i] - '0' + 1;}while (limit < n + m + 1)limit <<= 1;vector<cd> f(limit), g(limit);for (int i = 0; i < m; i++)f[i] = a[i] * a[i] * a[i];for (int i = 0; i < n; i++)g[n - i] = b[i];fft(f, 1);fft(g, 1);for (int i = 0; i < limit; i++)f[i] *= g[i];fft(f, -1);for (int i = 0; i+m-1 < n; i++)ans[i] += f[n-i].real() / limit;fill(f.begin(), f.end(), 0);fill(g.begin(), g.end(), 0);for (int i = 0; i < m; i++)f[i] = a[i];for (int i = 0; i < n; i++)g[n - i] = b[i] * b[i] * b[i];fft(f, 1);fft(g, 1);for (int i = 0; i < limit; i++)f[i] *= g[i];fft(f, -1);for (int i = 0; i+m-1 < n; i++)ans[i] += f[n-i].real() / limit;fill(f.begin(), f.end(), 0);fill(g.begin(), g.end(), 0);for (int i = 0; i < m; i++)f[i] = a[i] * a[i];for (int i = 0; i < n; i++)g[n - i] = b[i] * b[i];fft(f, 1);fft(g, 1);for (int i = 0; i < limit; i++)f[i] *= g[i];fft(f, -1);for (int i = 0; i+m-1 < n; i++)ans[i] -= 2 * f[n-i].real() / limit;for (int i = 0; i+m-1 < n; i++) {if (abs(ans[i]) < 0.5) {res.push_back(i+1);}}int k = res.size();printf("%d\n", k);for (auto x : res)printf("%d ", x);return 0;
}
http://www.jsqmd.com/news/641316/

相关文章:

  • 科普|北京名家字画回收,认准本草拾光徐先生:实在人品,专业护航,不玩套路不忽悠 - 品牌排行榜单
  • 一步到位:基于SDXL-Turbo的实时图像风格迁移实战
  • GD32F303工程模板DIY:从零手搓文件夹结构到一键编译烧录(附标准库文件管理心得)
  • 终极Unity游戏翻译指南:3步配置XUnity.AutoTranslator实现无障碍游戏体验
  • 2026年 钛酸酯偶联剂厂家推荐,固体/液体钛酸酯偶联剂/铝钛复合偶联剂/硅烷偶联剂优质供应商 - 品牌推荐用户报道者
  • 【实战指南】利用Docker快速搭建RustDesk私有中继服务器
  • RK3568 EDP显示适配实战:从硬件连接到软件调试全解析
  • 如何高效利用vectorizer:专业图像矢量化转换的完整实战指南
  • 拒绝模糊边界!5分钟为Qt应用添加智能弹窗遮罩层(QDialog版)
  • 从建图到导航:手把手教你用Gmapping + AMCL + Move_Base完成机器人小车的完整自主导航流程
  • 5分钟学会Qwen3-ASR:1.7B语音识别模型部署与API调用
  • 权限管理+备份
  • ncmdumpGUI:解锁网易云音乐NCM文件的终极指南,让音乐随处可听
  • 如何安全使用R3nzSkin:3步掌握英雄联盟换肤工具完整指南
  • UVa 11165 Galactic Travel
  • 【限时解密】SITS2026多模态预训练权重初始化协议:3步规避模态坍缩,附可运行PyTorch模板
  • AO3镜像站终极指南:7个关键步骤轻松访问全球最大同人创作平台
  • 千问3.5-2B在内容审核场景:UGC图片敏感主体识别与文字合规初筛
  • 【原创】IgH EtherCAT主站详解(一)--EtherCAT协议、帧格式和ESC
  • [具身智能-360]:部署和调用大语言模型主要有两种路径:云服务API调用和私有化部署。
  • 别再为UniApp和WebView通信发愁了!一个真实项目中的消息传递实战(附完整SDK配置流程)
  • MySL优化全攻略:索引、SL与分库分表的最佳实践
  • Linux内存管理全解析:从原理到实践,让你的服务器不再“内存不足”
  • 混合有源滤波器(HAPF)的MATLAB-Simulink仿真及补偿前后系统谐波对比
  • OpenClaw进阶实战(十三):电商比价工作流(二)——智能比价与动态调价
  • TGRS 2026 即插即用 | 注意力篇 | HEWL:小波上采样,通道-空间-频域交互联合高频增强,细节全保留!
  • K8s Ingress实战:从零配置Nginx Ingress Controller,实现基于路径和域名的灵活路由
  • 卫星通信是利用地球同步卫星作为中继站转发微波信号,实现地面站之间远距离通信的技术
  • ZYNQ中断编程避坑指南:从定时器中断看GIC配置与常见错误排查
  • ST7789显示屏终极指南:用STM32硬件SPI实现快速DMA驱动的完整方案