【题意】给定长度为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=1100010,N=300010;
const double PI=acos(-1);
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=0;}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=0;for(int i=0;i<n;i++){if(i<k)swap(a[i],a[k]);for(int j=n>>1;(k^=j)<j;j>>=1);}for(int l=2;l<=n;l<<=1){int m=l/2;cp wn(cos(2*PI*f/l),sin(2*PI*f/l));for(cp *p=a;p!=a+n;p+=l){cp w(1,0);for(int i=0;i<l/2;i++){cp t=w*p[i+m];p[i+m]=p[i]-t;p[i]=p[i]+t;w=w*wn;}}}if(f==-1)for(int i=0;i<n;i++)a[i].x/=n;
}
int main(){scanf("%d%d%s%s",&m,&n,B,A);for(int i=0;i<n;i++)aa[n-i-1]=(A[i]=='*'?0:A[i]-'a'+1);for(int i=0;i<m;i++)bb[i]=(B[i]=='*'?0:B[i]-'a'+1);for(int i=0;i<n;i++)A1[i]=cp(aa[i],0),A2[i]=cp(aa[i]*aa[i],0),A3[i]=cp(aa[i]*aa[i]*aa[i],0);for(int i=0;i<m;i++)B1[i]=cp(bb[i],0),B2[i]=cp(bb[i]*bb[i],0),B3[i]=cp(bb[i]*bb[i]*bb[i],0);int N=1;while(N<n+m)N<<=1;fft(A1,N,1);fft(B1,N,1);fft(A2,N,1);fft(B2,N,1);fft(A3,N,1);fft(B3,N,1);for(int i=0;i<N;i++)A1[i]=A3[i]*B1[i]-cp(2,0)*A2[i]*B2[i]+A1[i]*B3[i];fft(A1,N,-1);int cnt=0;for(int i=0;i<=n-m;i++)if(!((int)(A1[n-1-i].x+0.1)))d[++cnt]=i+1;printf("%d\n",cnt);for(int i=1;i<=cnt;i++)printf("%d ",d[i]);return 0;
}

View Code

转载于:https://www.cnblogs.com/onioncyc/p/8858083.html

【BZOJ】4259: 残缺的字符串 FFT相关推荐

  1. BZOJ 4259: 残缺的字符串 [FFT]

    4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...

  2. P4173 残缺的字符串 FFT匹配含有通配符的字符串

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为m,nm,nm,n的串a,ba,ba,b,问你bbb串中每个长度为mmm的连续字串能否与aaa完全匹配,其中含有通配符∗*∗,输出每个位置的开头 ...

  3. 【BZOJ4259】残缺的字符串

    题面 1684 -- [BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现 ...

  4. 洛谷 - P4173 残缺的字符串(多项式匹配字符串-NTT)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,都含有通配符 '*',现在问字符串 ttt 可以匹配字符串 nnn 的哪些位置 题目分析 ...

  5. P4173 残缺的字符串

    P4173 残缺的字符串 题意: 有A,B两个串,每个串都有通配符,问A为模板串,对于 B 的每一个位置 i,从这个位置开始连续 m 个字符形成的子串是否可能与 A 串完全匹配? 题解: 我们定义两个 ...

  6. BZOJ 4259 FFT

    思路: 为什么好多字符串的题都可以用FFT啊.... 我们其实是要判断$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$ 那就把a串翻转过来 把 上式展开 大力做几遍FFT就好啦~ ...

  7. 洛谷P4173:残缺的字符串(FFT、通配符匹配)

    解析 通配符匹配的经典题. 设单词串为 AAA,文章串为 BBB. 把 AAA 翻转一下,判断问题就能转化为一个卷积的形式: F(p)=&i=0m−1match(Ai+1,Bp−i)F(p)= ...

  8. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  9. BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)

    LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...

最新文章

  1. jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他
  2. cocoscreator editbox 只允许数字_《Cocos Creator游戏实战》做一个数字调节框
  3. Windows8Windows Phone 做一个图片效果
  4. Web前后端:如何分离,如何解耦?
  5. AlexNet卷积神经网络
  6. python自定义变量名有哪些_Python学习第161课——自定义变量和导出变量
  7. 决策树(十二)--XGBoost
  8. dnsmasq安装配置
  9. html网页怎么分页打印,web如何实现页面分页打印
  10. Zint 库:Zint库的编译及使用(二维码QrCode生码),MFC/VC使用实例
  11. 理解LaaS、SaaS、PaaS的含义及区别
  12. 用python wxpy管理微信公众号,并利用微信获取自己的开源数据。
  13. 程序员要为了生活而工作,不要为了工作而生活。
  14. 执行npm出现“Error:Cannot find module ‘fs/promises”的问题
  15. 解决:RuntimeError: CUDA error: device-side assert triggered
  16. FXO和FXS的区别
  17. 商业智能BI建设是沉淀、变革与倒逼,心动不如行动
  18. 解决spring定时任务执行两次和tomcat部署缓慢的问题
  19. 【前端】相对定位实现十字居中(上下左右居中)
  20. 论文《Adversarial Binary Coding for Efficient Person Re-identification》翻译笔记

热门文章

  1. python就业前景分析-最新的Python就业前景分析一览表
  2. python解释器是什么-python-解释器在这里做什么
  3. python语言程序设计梁勇-Python语言程序设计(美-梁勇)第1章习题解答
  4. python爬虫抓取图片-python网络爬虫源代码(可直接抓取图片)
  5. python语言基础-详细的总结一下python入门基础语言知识!
  6. python编程在哪里写-python3.6.3 安装好了在哪里编写程序
  7. python哪一版好用-Python 可视化工具库哪款最好用?哪款最不好用?
  8. Bitmap的使用(三)
  9. Restful设计相关
  10. java多线程11.非阻塞同步机制