Description:

给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置

Hint:

\(n \le 3*10^5\)

Solution:

定义匹配函数 \(P(x)=\sum_{i=x}^{x+m}(S1[i]-S2[i])^2*S1[i]*S2[i]​\)

展开的式子太长,有时间再放

大概是一堆字符串卷积

翻转后FFT即可

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=2e6+5;
const double PI=acos(-1);
int n,m,l,tot,lim=1,a[mxn],b[mxn],r[mxn],q[mxn];
ll s[mxn];
char s1[mxn],s2[mxn];
inline int read() {char c=getchar(); int x=0,f=1;while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}return x*f;
}
inline int chkmax(register int &x,register int y) {if(x<y) x=y;}
inline int chkmin(register int &x,register int y) {if(x>y) x=y;}struct ed {int to,nxt;
}t[mxn<<1];struct cp {double x,y;cp (double xx=0,double yy=0) {x=xx;y=yy;}friend cp operator + (cp a,cp b) {return cp(a.x+b.x,a.y+b.y);}friend cp operator - (cp a,cp b) {return cp(a.x-b.x,a.y-b.y);}friend cp operator * (cp a,cp b) {return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
}A[mxn],B[mxn],C[mxn];void FFT(cp *p,register int opt)
{for(register int i=0;i<lim;++i) if(i<r[i]) swap(p[i],p[r[i]]);for(register int mid=1;mid<lim;mid<<=1) {cp wn=cp(cos(PI/mid),opt*sin(PI/mid));for(register int len=mid<<1,j=0;j<lim;j+=len) {cp w=cp(1,0);for(register int k=0;k<mid;++k,w=w*wn) {cp x=p[j+k],y=w*p[j+mid+k];p[j+k]=x+y; p[j+mid+k]=x-y;}}}
}int main()
{scanf("%d%d%s%s",&m,&n,s1,s2);for(register int i=0,j=m-1;i<j;++i,--j) swap(s1[i],s1[j]);for(register int i=0;i<m;++i) if(s1[i]!='*') a[i]=s1[i]-'a'+1;for(register int i=0;i<n;++i) if(s2[i]!='*') b[i]=s2[i]-'a'+1;while(lim<=n+m) ++l,lim<<=1;for(register int i=0;i<lim;++i) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));for(register int i=0;i<=lim;++i) A[i]=cp(a[i]*a[i]*a[i],0),B[i]=cp(b[i],0);FFT(A,1); FFT(B,1); for(register int i=0;i<=lim;++i) C[i]=A[i]*B[i];FFT(C,-1);for(register int i=0;i<=lim;++i) s[i]+=(ll)(C[i].x/lim+0.5);for(register int i=0;i<=lim;++i) A[i]=cp(a[i],0),B[i]=cp(b[i]*b[i]*b[i],0);FFT(A,1); FFT(B,1);for(register int i=0;i<=lim;++i) C[i]=A[i]*B[i];FFT(C,-1);for(register int i=0;i<=lim;++i) s[i]+=(ll)(C[i].x/lim+0.5);for(register int i=0;i<=lim;++i)A[i]=cp(a[i]*a[i],0),B[i]=cp(b[i]*b[i],0);FFT(A,1); FFT(B,1); for(register int i=0;i<=lim;++i) C[i]=A[i]*B[i];FFT(C,-1);for(register int i=0;i<=lim;++i) s[i]-=2*(ll)(C[i].x/lim+0.5);for(register int i=m-1;i<n;++i) if(s[i]==0) q[++tot]=i-m+2;printf("%d\n",tot);for(register int i=1;i<=tot;++i) printf("%d ",q[i]);return 0;
}

转载于:https://www.cnblogs.com/list1/p/10504685.html

[BZOJ4259]残缺的字符串相关推荐

  1. 【BZOJ4259】残缺的字符串

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

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

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

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

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

  4. P4173 残缺的字符串

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

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

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

  6. 【BZOJ】4259: 残缺的字符串 FFT

    [题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...

  7. ●Codevs 4158 残缺的字符串

    题链: http://codevs.cn/problem/4158/ 题解: FFT. 定义两个相同长度的字符串s1,s2的距离为 $$dis(s1,s2)=\sum_{i=0}^{len-1}(s1 ...

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

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

  9. LGP4173残缺的字符串

    题解 由于有通配符,所以$kmp$失效了: 将通配符看成0,其余字符看成互不相同的数字,$A,B$串对应得到$a,b$数组; 定义: $f(p) = \sum_{i=0}^{m-1} a_{i}b_{ ...

最新文章

  1. Java多线程模式-Balking模式
  2. why-and-howto-calculate-your-events-per-second
  3. centos7 安装图形界面、VNCserver
  4. Spring高级之注解@lazy详解(超详细)
  5. 为什么你应该在 OpenResty 项目中使用 lua-resty-core
  6. Q96:PT(3.4):砂岩纹理(Sandstone Texture)
  7. 00-JavaScript基础-基本概念
  8. 破茧成蝶2——以产品为中心的设计革命
  9. php完美pdo类封装,PDO类的封装
  10. 蒟蒻退役记————————————(3)
  11. integrate函数python_scipy.integrate Pseudo-Voigt函数,积分变为0
  12. Linux系统的简易命令(三)
  13. 原生 APP 与 web APP的区别比较
  14. linux启用dcb步骤,DCB文件擴展名: 它是什麼以及如何打開它?
  15. Linux创建和删除目录
  16. png图片查重小工具
  17. X-Pack:创建阈值检查警报
  18. 01 搭建一个Ubuntu 开发机
  19. FCN 全卷积神经网络
  20. 【数据结构算法】递归:八皇后问题

热门文章

  1. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解
  2. Java中集合(三)Stack
  3. (5) DSP28335--SCI
  4. [Qt教程] 第37篇 网络(七)TCP(一)
  5. java常见的排序算法_常见排序算法及Java实现
  6. Java协作开发,Java开发学习笔记之八:servlet之间的协作
  7. 东莞市初中生中考计算机内容,2019年广东东莞市中考考试科目及内容
  8. dhrystone测试结果_RTThread软件包可以对MCU进行性能测试,跑一个试试!
  9. spring无法用三级缓存解决循环依赖的问题分析
  10. 最长有效括号—leetcode32