思路:

为什么好多字符串的题都可以用FFT啊....

我们其实是要判断$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$

那就把a串翻转过来 把 上式展开

大力做几遍FFT就好啦~

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define double long double
const double pi=acos(-);
const int N=;
int nn,mm,n,L,R[N],all;
struct Complex{
double x,y;Complex(){}
Complex(double X,double Y){x=X,y=Y;}
}A[N],B[N],ans[N];
Complex operator+(Complex a,Complex b){return Complex(a.x+b.x,a.y+b.y);}
Complex operator-(Complex a,Complex b){return Complex(a.x-b.x,a.y-b.y);}
Complex operator*(Complex a,Complex b){return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
Complex operator/(Complex a,int b){return Complex(a.x/b,a.y/b);}
void FFT(Complex *E,int f){
for(int i=;i<n;i++)if(i<R[i])swap(E[i],E[R[i]]);
for(int l=;l<n;l<<=){
Complex wn=Complex(cos(pi/l),f*sin(pi/l));
for(int j=;j<n;j+=(l<<)){
Complex w=Complex(,);
for(int k=;k<l;k++,w=w*wn){
Complex x=E[j+k],y=w*E[j+k+l];
E[j+k]=x+y,E[j+k+l]=x-y;
}
}
}
if(!~f)for(int i=;i<n;i++)E[i]=E[i]/n;
}
char a[N],b[N];
int main(){
scanf("%d%d%s%s",&mm,&nn,a,b);
for(n=;n<=mm+nn;n<<=)L++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));
reverse(a,a+mm);
for(int i=;i<mm;i++)if(a[i]=='*')a[i]=;else a[i]=a[i]-'a'+;
for(int i=;i<nn;i++)if(b[i]=='*')b[i]=;else b[i]=b[i]-'a'+;
for(int i=;i<mm;i++)A[i].x=a[i];
for(int i=;i<nn;i++)B[i].x=b[i]*b[i]*b[i];
FFT(A,),FFT(B,);
for(int i=;i<n;i++)ans[i]=A[i]*B[i];
for(int i=;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=;
for(int i=;i<mm;i++)A[i].x=a[i]*a[i]*a[i];
for(int i=;i<nn;i++)B[i].x=b[i];
FFT(A,),FFT(B,);
for(int i=;i<n;i++)ans[i]=ans[i]+A[i]*B[i];
for(int i=;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=;
for(int i=;i<mm;i++)A[i].x=a[i]*a[i];
for(int i=;i<nn;i++)B[i].x=b[i]*b[i];
FFT(A,),FFT(B,);
for(int i=;i<n;i++)ans[i]=ans[i]-A[i]*B[i]-A[i]*B[i];
FFT(ans,-);
for(int i=mm-;i<nn;i++)if(fabs(ans[i].x)<)all++;
printf("%d\n",all);
for(int i=mm-;i<nn;i++)if(fabs(ans[i].x)<)printf("%d ",i-mm+);
}

BZOJ 4259 FFT的更多相关文章

  1. BZOJ 4259 残缺的字符串(FFT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4259 [题目大意] 给出两个包含*和小写字母的字符串,*为适配符,可以和任何字符匹配, ...

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

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

  3. BZOJ 4259 残缺的字符串 ——FFT

    [题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...

  4. bzoj 4259 4259: 残缺的字符串【FFT】

    和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符 有点卡常,先在点值下算最后一起IDFT #inclu ...

  5. BZOJ 2179 FFT快速傅立叶 题解

    bzoj 2179 Description 给出两个n位10进制整数x和y,你需要计算x*y. [题目分析] 高精裸题.练手. [代码] 1.手动高精 #include<cstdio> # ...

  6. 【刷题】BZOJ 4259 残缺的字符串

    Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...

  7. BZOJ 2179: FFT快速傅立叶

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2923  Solved: 1498[Submit][Status][Di ...

  8. BZOJ 2179 FFT快速傅里叶

    fft. #include<set> #include<map> #include<ctime> #include<queue> #include< ...

  9. BZOJ 4259 残缺的字符串

    思路 同样是FFT进行字符串匹配 只不过两个都有通配符 匹配函数再乘一个\(A_i\)即可 代码 #include <cstdio> #include <algorithm> ...

随机推荐

  1. 用SQL Server查询所有数据并显示

    利用SQL Server查询数据,并把所有数据显示在页面上. "%> <%@page import="jdbc.sqlServer"%> <%@p ...

  2. sql server 存储过程(事务,带参数声明,数据库瘦身)

    CREATE PROCEDURE procedureName (@var1 as varchar(50),@var2 as varchar(50)) --建立未发临时表 AS begin tran - ...

  3. jQuery顺序加载图片(初版)

    浏览器加载图片区别: IE:同时加载与渲染 其他:加载完之后再渲染 根据这个差异用jQuery做个实例:按顺序加载一组图片,加载完成后提示. <!DOCTYPE html> <htm ...

  4. selenium获取页面通过样式隐藏获取不到元素解决方案

    如图更换图像这个按钮通过bottom:-30px隐藏了,通过如下代码获取不到页面元素,后台会报错 driver.findElement(By.className("js-avator-lin ...

  5. 与swift协议相关的技术

    一.协议定义与实现: 1.关联类型: 2.协议组合: 3.协议扩展: 4.协议实现. 二.协议使用:

  6. Js构造对象-添加方法的三种方式

    Js构造函数添加方法有多种方案,来看一个混合方式构造函数的例子:申明person构造函数,有两个属性,name,qq.在原型上添加方法showname.这是最常用的方法. <script> ...

  7. javascrip this指向问题深入理解

    在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余. 1. 一般用处 对 ...

  8. vue,基础整理,夯实基础,为进阶打基础

    把基础部分,再次系统的了解一遍,整理成文档.

  9. js-2018-11-09 关于Array中的srot()方法和compare()方法

    Array中的srot()方法 sort()方法是用来重排序的方法.在默认情况下,sort()方法按升序排列数组项----即最小的值位于最前面,最大的值排在最后面. 我们看看官方是怎么说的: arra ...

  10. 1069. The Black Hole of Numbers

    For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in ...