【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 ...
随机推荐
- [2017BUAA软工]个人项目心得体会:数独
心得体会 回顾此次个人项目,感受比较复杂,最明显的一点是--累!代码编写.单元测试.代码覆盖.性能优化,环环相扣,有种从作业发布开始就一直在赶DDL的感觉,但是很充实,也学习到和体验了很多东西.最令人 ...
- PHP TS 和 NTS 版本选择
在PHP 开发和生产环境搭建过程中,需要安装PHP语言解析器.官方提供了2种类型的版本,线程安全(TS)版和非线程安全(NTS)版,有时后我们开发环境和实际生产的环境有所不同,因此也需要选择安装对应的 ...
- mysql 数字类型的长度区别
mysql整型bigint.int.mediumint.smallint 和 tinyint的语法介绍,如下: 1.bigint 从 -2^63 (-9223372036854775808) 到 2^ ...
- Mysql的两种引擎的区别
Innodb引擎概述 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别.该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MyS ...
- UVA11248_Frequency Hopping
给一个有向网络,求其1,n两点的最大流量是否不小于C,如果小于,是否可以通过修改一条边的容量使得最大流量不小于C? 首先对于给定的网络,我们可以先跑一遍最大流,然后先看流量是否大于C. 然后保存跑完第 ...
- 对\${ctx}的一点理解
一.\${ctx}与${pageContext.request.contextPath}的区别 相同点: \${ctx}和\${pageContext.request.contextPath}都是获取 ...
- 【刷题】BZOJ 3732 Network
Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_ ...
- 【刷题】BZOJ 2594 [Wc2006]水管局长数据加强版
Description SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一 ...
- Round 1 Over
终于把题目清单上的 \(dp\) 写完了\(hhh\)
- 【BZOJ2463】谁能赢呢?(博弈论)
[BZOJ2463]谁能赢呢?(博弈论) 题面 BZOJ 洛谷 题解 洛谷上对于难度的评级我总觉有些问题. 很多人按照代码难度而并非思维难度在评级,导致很多评级很不合理啊... 不说废话了.. 对于一 ...