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;
}

转载于:https://www.cnblogs.com/dsrdsr/p/11219437.html

luoguP4173 残缺的字符串 FFT相关推荐

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

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

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

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

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

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

  4. 【BZOJ4259】残缺的字符串

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

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

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

  6. P4173 残缺的字符串

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

  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. ●Codevs 4158 残缺的字符串

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

  10. LGP4173残缺的字符串

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

最新文章

  1. java加法器_javacc例子:加法器
  2. 《北妹》:中国七零后作家的一次火山喷发(答记者问)
  3. 程序员跳槽全攻略pdf
  4. python1~10阶乘while_Python3基础 while 阶乘
  5. calibre for linux,calibre - 下载Linux版
  6. Mr.J--.c 和.cpp 后缀详解
  7. 图像处理(1)----图像压缩
  8. 虚拟化与私有云的区别
  9. 我的编程认知:多思考、多编码、多测试
  10. OpenSSH升级-无需替换旧版本文件
  11. PDFCreator(pdf转换器电脑版免费版)官方繁体中文版V4.3.0 | PDF生成器下载 | pdf转换器哪个好用?
  12. Xilinx平台SRIO介绍(汇总篇)
  13. 深度学习中的激活函数
  14. 中国电信计算机通讯类笔试试题,中国电信技术岗位笔试题.pdf
  15. neo4j安装算法插件-GDS
  16. 毕业论文(设计)开题报告
  17. 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
  18. 机器学习实战(七):Ensemble Learning and Random Forests
  19. 机器指令-微指令存储相关基本概念
  20. JAVA基础经典50题

热门文章

  1. java dvr_java – 如何设置与DVR的连接并解码数据?
  2. PHP语言25周年,PHP是世界上最好的语言
  3. apply for KPMG preparing
  4. 苹果手机怎么将PDF转换成JPG图片
  5. 第十二课,assimp模型加载(数据加载篇)
  6. JavaGUI——背景图片设置
  7. 武田收到CHMP同意ALUNBRIG® (brigatinib)用于ALK+非小细胞肺癌一线治疗的肯定意见
  8. 科研入门 | 会议、期刊、出版社、数据库等常识
  9. 同个网络找不到计算机打印机共享,搜索不到共享打印机怎么办_同一局域网找不到共享打印机的解决方法-系统城...
  10. 【备忘】Pr基本操作