【BZOJ】4259: 残缺的字符串 FFT
【题意】给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次。字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符。n<=3*10^5。
【算法】FFT
【题解】假设模板串的数组A用0~26代表所有字符,0为通配符,匹配串的数组B同理,那么用表示差异的经典套路:
$$C_n=\sum_{i=0}^{m-1}(A_{n+i}-B_i)^2*A_{n+i}*B_i$$
那么可以看出$C_n=0$当且仅当$S_A[n,n+m-1]=S_B[0,m-1]$。这里的通配符为0,所以当含有通配符时式子直接为0,即无差异。
将数组A反转,得到:
$$C_x=\sum_{i=0}^{m-1}(A'_{n-x-i-1}-B_i)^2*A'_{n-x-i-1}*B_i$$
尝试扩展上届:
$$C_x=D_{n-x-1}=\sum_{i=0}^{n-x-1}(A'_{n-x-i-1}-B_i)^2*A'_{n-x-i-1}*B_i$$
现在只需要计算Dx了,二项式拆分得到:
$$D_x=\sum_{i=0}^{x}A_{x-i}^3B_i-2A_{x-i}^2B_i^2+A_{x-i}B_i^3$$
(这里公式不知道A后为什么不能加单引号,不然latex会出错)
复杂度O(n log n)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=,N=;
const double PI=acos(-);
int m,n,aa[N],bb[N],d[N];
char A[N],B[N];
struct cp{
double x,y;
cp(double a,double b){x=a;y=b;}
cp(){x=y=;}
cp operator + (cp a){return cp(x+a.x,y+a.y);}
cp operator - (cp a){return cp(x-a.x,y-a.y);}
cp operator * (cp a){return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}A1[maxn],A2[maxn],A3[maxn],B1[maxn],B2[maxn],B3[maxn];
void fft(cp *a,int n,int f){
int k=;
for(int i=;i<n;i++){
if(i<k)swap(a[i],a[k]);
for(int j=n>>;(k^=j)<j;j>>=);
}
for(int l=;l<=n;l<<=){
int m=l/;
cp wn(cos(*PI*f/l),sin(*PI*f/l));
for(cp *p=a;p!=a+n;p+=l){
cp w(,);
for(int i=;i<l/;i++){
cp t=w*p[i+m];
p[i+m]=p[i]-t;
p[i]=p[i]+t;
w=w*wn;
}
}
}
if(f==-)for(int i=;i<n;i++)a[i].x/=n;
}
int main(){
scanf("%d%d%s%s",&m,&n,B,A);
for(int i=;i<n;i++)aa[n-i-]=(A[i]=='*'?:A[i]-'a'+);
for(int i=;i<m;i++)bb[i]=(B[i]=='*'?:B[i]-'a'+);
for(int i=;i<n;i++)A1[i]=cp(aa[i],),A2[i]=cp(aa[i]*aa[i],),A3[i]=cp(aa[i]*aa[i]*aa[i],);
for(int i=;i<m;i++)B1[i]=cp(bb[i],),B2[i]=cp(bb[i]*bb[i],),B3[i]=cp(bb[i]*bb[i]*bb[i],);
int N=;while(N<n+m)N<<=;
fft(A1,N,);fft(B1,N,);
fft(A2,N,);fft(B2,N,);
fft(A3,N,);fft(B3,N,);
for(int i=;i<N;i++)A1[i]=A3[i]*B1[i]-cp(,)*A2[i]*B2[i]+A1[i]*B3[i];
fft(A1,N,-);
int cnt=;
for(int i=;i<=n-m;i++)if(!((int)(A1[n--i].x+0.1)))d[++cnt]=i+;
printf("%d\n",cnt);
for(int i=;i<=cnt;i++)printf("%d ",d[i]);
return ;
}
【BZOJ】4259: 残缺的字符串 FFT的更多相关文章
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
- BZOJ 4259 残缺的字符串 ——FFT
[题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...
- BZOJ 4259 残缺的字符串(FFT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4259 [题目大意] 给出两个包含*和小写字母的字符串,*为适配符,可以和任何字符匹配, ...
- 【刷题】BZOJ 4259 残缺的字符串
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...
- BZOJ 4259: 残缺的字符串 FFT_多项式
Code: #include<bits/stdc++.h> #define maxn 1200000 using namespace std; void setIO(string s) { ...
- BZOJ 4259 残缺的字符串
思路 同样是FFT进行字符串匹配 只不过两个都有通配符 匹配函数再乘一个\(A_i\)即可 代码 #include <cstdio> #include <algorithm> ...
- luoguP4173 残缺的字符串 FFT
luoguP4173 残缺的字符串 FFT 链接 luogu 思路 和昨天做的题几乎一样. 匹配等价于(其实我更喜欢fft从0开始) \(\sum\limits_{i=0}^{m-1}(S[i+j]- ...
- 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 ...
随机推荐
- 简单 dp
1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...
- Littleproxy的使用
介绍 LittleProxy是一个用Java编写的高性能HTTP代理,它基于Netty事件的网络库之上.它非常稳定,性能良好,并且易于集成到的项目中. 项目页面:https://github.com/ ...
- QT源码解析(七)Qt创建窗体的过程,作者“ tingsking18 ”(真正的创建QPushButton是在show()方法中,show()方法又调用了setVisible方法)
前言:分析Qt的代码也有一段时间了,以前在进行QT源码解析的时候总是使用ue,一个函数名在QTDIR/src目录下反复的查找,然后分析函数之间的调用关系,效率实在是太低了,最近总结出一个更简便的方法, ...
- app流畅度测试--使用FPS Meter
1.FFPS Meter是一款非常实用的小软件,能够用数字实时显示安卓界面的每秒帧数,非常直观.此外,FPS Meter还可以显示最大帧数.最小帧数以及平均帧数,用来评价安卓流畅度极具价值.由于涉及到 ...
- Win10系统 安装Anaconda+TensorFlow+Keras
小白一枚,安装过程走了很多坑,前前后后安装了好几天,因此记录一下. 一.安装anaconda 官方下载地址:https://repo.continuum.io/archive/ 选项相应的版本安装,我 ...
- git 常用命令(含删除文件)
git 常用命令(含删除文件) Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库: ...
- 洛谷 P1939 【模板】矩阵加速(数列) 解题报告
P1939 [模板]矩阵加速(数列) 题目描述 a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值 ...
- 【bzoj2154】 Crash的数字表格
http://www.lydsy.com/JudgeOnline/problem.php?id=2154 (题目链接) 题意 给出${n,m}$,求$${\sum_{i=1}^n\sum_{j=1}^ ...
- CAS使用心得
1.理解CAS实现SSO需要哪些组成部分 2.理解CAS实现SSO流程,包括登陆.注销.二次登陆.其他应用登陆 3.CAS部署需要SSL支持,理解容器如何开启SSL.服务端证书.jre证书信任.创建以 ...
- GoLand语言快捷键
快捷键 作用 备注 ctrl + n 导航到类名 ctrl + shift + n 导航到文件 ctrl + e/ctrl + shift + e 打开到最近的文件/打开最近修改的文件 ctrl + ...