luoguP4173 残缺的字符串 FFT

链接

luogu

思路

和昨天做的题几乎一样。

匹配等价于(其实我更喜欢fft从0开始)

\(\sum\limits_{i=0}^{m-1}(S[i+j]-T[i])^2*T[i]*S[i]=0\)

展开得到

\(\sum\limits_{i=0}^{m-1}S_{i+j}^3T_{i}+\sum\limits\S_{i+j}T_{i}^3-2\sum\limits\S_{i+j}^2T_{i}^2=0\)

反转T串串

\(\sum\limits_{i=0}^{m-1}S_{i+j}^3T_{m-1-i}+\sum\limits\S_{i+j}T_{m-1-i}^3-2\sum\limits\S_{i+j}^2T_{m-1-i}^2=0\)

然后三次卷积就行了。

写完看了看别的代码,感觉自己的代码太蠢了,多fft了好几次。

错误

我居然同样的错误犯了好几遍。

昨天也是wrong在最后从0到n-m判断,这次又是。

而且我还想了好久。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1200000+7;
const double Pi=acos(-1),eps=1e-9;
int limit=1,p,r[N<<1];
int fff(int x) {return x*x*x;}
int ff(int x) {return x*x;}
struct Complex {
double x,y;
Complex(double xx=0,double yy=0) {x=xx,y=yy;}
}a[N<<1],b[N<<1],tot[N<<1];
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.y*b.x+b.y*a.x);}
void fft(Complex *a,int type) {
for(int i=0;i<limit;++i)
if(i<r[i]) swap(a[r[i]],a[i]);
for(int mid=1;mid<limit;mid<<=1) {
Complex Wn(cos(Pi/mid),type*sin(Pi/mid));
for(int i=0;i<limit;i+=mid<<1) {
Complex w(1,0);
for(int j=0;j<mid;++j,w=w*Wn) {
Complex x=a[i+j],y=w*a[i+j+mid];
a[i+j]=x+y;
a[i+j+mid]=x-y;
}
}
}
if(type==-1) for(int i=0;i<limit;++i) a[i].x/=limit;
}
int n,m,s[N],t[N];
char S[N],T[N];
int main() {
scanf("%d%d%s%s",&m,&n,T,S);
for(int i=0;i<n;++i) s[i]=S[i]=='*'?0:S[i]-'a'+1;
for(int i=0;i<m;++i) t[m-i-1]=T[i]=='*'?0:T[i]-'a'+1;
while(limit<n+m) limit<<=1,p++;
for(int i=0;i<limit;++i)
r[i]=(r[i>>1]>>1)|((i&1)<<(p-1)); for(int i=0;i<limit;++i) a[i]=Complex(s[i],0),b[i]=Complex(fff(t[i]),0);
fft(a,1),fft(b,1);
for(int i=0;i<limit;++i) tot[i]=tot[i]+a[i]*b[i]; for(int i=0;i<limit;++i) a[i]=Complex(fff(s[i]),0),b[i]=Complex(t[i],0);
fft(a,1),fft(b,1);
for(int i=0;i<limit;++i) tot[i]=tot[i]+a[i]*b[i]; for(int i=0;i<limit;++i) a[i]=Complex(ff(s[i]),0),b[i]=Complex(ff(t[i]),0);
fft(a,1),fft(b,1);
for(int i=0;i<limit;++i) tot[i]=tot[i]-a[i]*b[i]*Complex(2,0); fft(tot,-1); int ans=0;
for(int i=0;i<n-m+1;++i) if(fabs(round(tot[m+i-1].x))<eps) ans++;
printf("%d\n",ans);
for(int i=0;i<n-m+1;++i) if(fabs(round(tot[m+i-1].x))<eps) printf("%d ",i+1);
return 0;
}

luoguP4173 残缺的字符串 FFT的更多相关文章

  1. Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用

    P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...

  2. P4173 残缺的字符串(FFT字符串匹配)

    P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...

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

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

  4. 【BZOJ4259】残缺的字符串 FFT

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

  5. 洛谷 P4173 残缺的字符串 (FFT)

    题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...

  6. BZOJ4259:残缺的字符串(FFT)

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

  7. P4173 残缺的字符串 fft

    题意:给你两个字符串,问你第一个在第二个中出现过多少次,并输出位置,匹配时是模糊匹配*可和任意一个字符匹配 题解:fft加速字符串匹配; 假设上面的串是s,s长度为m,下面的串是p,p长度为n,先考虑 ...

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

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

  9. BZOJ4259: 残缺的字符串(FFT 字符串匹配)

    题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...

随机推荐

  1. C#中真正的属性

    引言 我们以前课堂上说的类当中的“属性”,其实官方叫法是“字段”或者“域”域(Field).正常使用,把它们当属性理解更加方便快捷,也没有什么问题. 如果要在微软的mvc中充分利用类带来的便利,就有必 ...

  2. Java IO---字节流和字符流

    一.IO流简介 流 流是一个抽象概念,Java程序和外部设备(可以是硬盘上的文件,也可以是网络设备)之间的输入输出操作是基于流的. 流就好比水管中的水流,具有流入和流出,类比数据的输入和输出. Jav ...

  3. chrome截屏的方法

    原文本文链接:https://blog.csdn.net/xiaofengzhiyu/article/details/94652057 Chrome保存整个网页为图片保存为图片右键检查快捷键Ctrl+ ...

  4. 手撕面试官系列(一):spring108道面试题合集

    前言 想必各位程序员已经开始准备金九银十的秋招了,创建这个这个系列文章的目的就是为了帮助大家解决面试的问题,系列文章将会一直更新,大家如果觉得不错可以关注我并转发,让更多程序兄弟看到~接下来我们进入正 ...

  5. Computer Neworking: A Top-Down Approach

    目录 Chapter 1: Computer Networks and the Internet 1. What is the Internet? 2. The Network Edge 3. The ...

  6. 阿里sentinel源码研究深入

    1. 阿里sentinel源码研究深入 1.1. 前言 昨天已经把sentinel成功部署到线上环境,可参考我上篇博文,该走的坑也都走了一遍,已经可以初步使用它的限流和降级功能,根据我目前的实践,限流 ...

  7. 如何使用Python的Django框架创建自己的网站

    如何使用Python的Django框架创建自己的网站 Django建站主要分四步:1.创建Django项目,2.将网页模板移植到Django项目中,3.数据交互,4.数据库 1创建Django项目 本 ...

  8. i18n,国际化翻译,excel与js互转

    背景 公司开发新产品时,要求适配多国语言,采用i18n国际化工具,但翻译字典(js的json)还是需要前端自己写的.字典最终需要转换成excel给专业人员翻译,翻译完成后再转换成js字典文件. 如果手 ...

  9. django应用之corsheaders[跨域设置]

    安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE ...

  10. SpringCloud学习第二章-SpringBoot

    SpringCloud 学习前提     SpringCloud是基于SpringBoot构建的,因此他延续了SpringBoot的契约模式以及开发方式.下面将讲到SpringBoot的构建方式. S ...