博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
残缺的字符串【FFT】
阅读量:6163 次
发布时间:2019-06-21

本文共 1079 字,大约阅读时间需要 3 分钟。

求对于\(B\)的每一个位置 \(i\),从这个位置开始连续\(m\)个字符形成的子串是否可能与\(A\)串完全匹配.\(1\le m\le n \le 3*{10}^5\)
两个位置\(A_i\)\(B_{j+i}\)匹配有三种情况:

  1. \(A_i\)为'*'
  2. \(B_{i+j}\)为'*'
  3. \(A_i = B_{i+j}\),即\(A_i-B_{i+j}=0\)

那么显然可以令'*'所在位置为0,把三种情况乘起来就可以判断一个位置是否匹配了

判断从\(j\)开始的\(m\)个位置是否匹配就是\[S(j)=\sum_{i=1}^m(A_i-B_{i+j})^2*A_i*B_{i+j}\]
\[S(j)=\sum_{i=1}^m(A_i^2-2*A_i*B_{i+j}+B_{i+j}^2)*A_i*B_{i+j}\]
\[=\sum_{i=1}^mA_i^3*B_{i+j}-2\sum_{i=1}^mA_i^2*B_{i+j}^2+\sum_{i=1}^mA_i*B_{i+j}^3\]
\(A\)翻转求卷积就好了

vector
q;double eps=1e-6;int dcmp(double x){if(fabs(x) < eps) return 0; return 1;}char c[Maxn];void solve(){ m=read(), n=read(); scanf("%s", c+1); for(int i=1; i <= m; i++) f[1][m-i].a=c[i] == '*' ? 0 : c[i]-'a'+1, f[2][m-i].a=f[1][m-i].a*f[1][m-i].a, f[3][m-i].a=f[1][m-i].a*f[2][m-i].a; scanf("%s", c); for(int i=0; i < n; i++) g[1][i].a=c[i] == '*' ? 0 : c[i]-'a'+1, g[2][i].a=g[1][i].a*g[1][i].a, g[3][i].a=g[1][i].a*g[2][i].a; while(lim <= n+m-2) lim<<=1, l++; for(int i=0; i < lim; i++) r[i]=(r[i>>1]>>1)|((i&1)<

转载于:https://www.cnblogs.com/zerolt/p/9298349.html

你可能感兴趣的文章
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>
WPF中,多key值绑定问题,一个key绑定一个界面上的对象
查看>>
UML类图简明教程
查看>>
java反编译工具(Java Decompiler)
查看>>
Android开发之自定义对话框
查看>>
微信Access Token 缓存方法
查看>>
Eclipsed的SVN插件不能识别之前工作空间的项目
查看>>
Linux 查看iptables状态-重启
查看>>
amazeui学习笔记一(开始使用2)--布局示例layouts
查看>>
c#中lock的使用(用于预约超出限额的流程)
查看>>
ODI基于源表时间戳字段获取增量数据
查看>>
并发容器之CopyOnWriteArrayList(转载)
查看>>