利用FFT来进行字符串匹配
给定串A和串B,A由26个小写字母构成,B由?和26个小写字母构成
?可以和任意字符匹配
求A中出现了多少次B
这里可以使用fft做法,定义向量A和向量B

然后求A和rev(B)的卷积结果C
C的第i-len(B)位就可以表示匹配结果
如果C的第i-len(B)位恰好是B中除了?的字符个数,那么就是匹配成功
这样复杂度就是O((n+m)*(logn + logm))
注意要调整eps,当数据很大的时候,误差会比较大
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <complex>
using namespace std;
const double pi = acos(-);
const int maxn = ;
typedef complex<double> Complex;
const double eps = 1e-;
void DFT(Complex *a, int n, int t)
{
if(n == ) return;
Complex a0[n>>], a1[n>>];
for(int i = ; i < n; i += ) a0[i>>] = a[i], a1[i>>] = a[i+];
DFT(a0, n>>, t); DFT(a1, n>>, t);
Complex wn(cos(*pi/n), t*sin(*pi/n)), w(, );
for(int i = ; i < (n>>); i++, w *= wn) a[i] = a0[i] + w*a1[i], a[i+(n>>)] = a0[i] - w*a1[i];
}
Complex a[maxn], b[maxn];
int n1, n2, nn, c[maxn];
double x;
string s1, s2;
int main()
{
freopen("a.txt", "r", stdin);
cin>>s1>>s2;
n1 = s1.length(); n2 = s2.length();
int N = n2;
for(int i = ; i < n1; i++) x = *pi*(s1[i] - 'a')/, a[i] = Complex(cos(x), sin(x));
for(int i = ; i < n2; i++)
if(s2[i] != '?') x = *pi*(s2[i] - 'a')/, b[i] = Complex(cos(-x), sin(-x));
else b[i] = Complex(, ), N--;
for(int i = ; i < n2/; i++) swap(b[i], b[n2-i-]);
n1--; n2--;
nn = ; while(nn <= n1+n2) nn <<= ;
DFT(a, nn, ); DFT(b, nn, );
for(int i = ; i <= nn; i++) a[i] = a[i]*b[i];
DFT(a, nn, -);
for(int i = ; i <= n1+n2; i++) c[i] = abs(a[i].imag()) < eps ? (a[i].real()/nn + eps) : ;
int ans = ;
for(int i = n2; i <= n1; i++) if(c[i] == N) ans++;
cout<<ans<<endl;
return ;
}
利用FFT来进行字符串匹配的更多相关文章
- 【python cookbook】【字符串与文本】3.利用shell通配符做字符串匹配
问题:当工作在Linux shell下时,使用常见的通配符模式(即,*.py.Dat[0-9]*.csv等)来对文本做匹配 解决方案:fnmatch模块提供的两个函数fnmatch().fnmatch ...
- BZOJ4259: 残缺的字符串(FFT 字符串匹配)
题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- FFT字符串匹配
本文半原创 参考资料:其实就是照抄的什么参考啊 我们知道KMP可以用来在线性复杂度内进行制胡窜匹配 今天教您一种新方法:用FFT进行字符串匹配 您可能觉得这很玄学,FFT不是做多项式卷积的吗,怎么还可 ...
- CF528D Fuzzy Search 字符串匹配+FFT
题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...
- BZOJ4259:残缺的字符串(FFT与字符串匹配)
很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺. 你想对这两 ...
- Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用
P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...
- P4173 残缺的字符串(FFT字符串匹配)
P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...
- 字符串匹配的KMP算法
~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...
随机推荐
- Linux下安装google拼音输入法
首先安装fcitx,前几天看了很多在ubuntu上能够使用的输入法,有人推荐是搜狗输入法,毕竟是国产嘛,但是会有意外发生,比如说安装之后会产生输入的字符乱码,是一堆看不懂的东西,我就是因为遇到了,然后 ...
- 【ospf-路由过滤】
- Java处理中文乱码问题
package servlet; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.ser ...
- JS 红包随机
微信随机红包,指定金额指定用户,随机发送红包 var moneys = new Array(); var moneyTotal = 0; function rand(obj){ if(obj.size ...
- 11个简单实用技巧--Java性能调优
多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识.是的,这并不没有错.诚然,优化应用程序以获得最好的性能并不是一件容易的事情,但这并不意味着你在没有获得这些经验和知识之前就不能做任何事 ...
- STM32F4使用FPU+DSP库进行FFT运算的测试过程二
原文地址:http://www.cnblogs.com/NickQ/p/8541156.html 测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32 ...
- 对URI的理解
在了解RESTful api的设计规范的时候,遇到了一个问题,就是uri和url有什关系,有什么区别,所以就在这里记录一下. URI(Uniform Resource Identifier),统一资源 ...
- oracle监听配置
在listener.ora文件中指定监听的实例名和修改ip地址: 查看实例名:[localhost$] echo $ORACLE_SID LISTENER = (DESCRIPTION_LIST = ...
- 单片机C51 8位流水灯
#include<reg51.h> sbit P1_0=0X90; sbit P1_1=0x91; sbit P1_2=0x92; sbit P1_3=0x93; sbit P1_4=0x ...
- 1698-Just a Hook 线段树(区间替换)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...