bzoj千题计划301:bzoj4259: 残缺的字符串
https://www.lydsy.com/JudgeOnline/problem.php?id=4259
令通配符=0
f[i+m-1]=Σ (a[i+j]-b[m-1-j])^2 * a[i+j] * b[m-1-j]
若a[i,i+m-1]能匹配上b[0,m-1],则f[i+m-1]=0
式子展开是三个卷积的和
FFT优化
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int N=(<<)+; const double eps=1e-; const double pi=acos(-); char s1[N],s2[N];
int t1[N],t2[N]; int rev[N]; double f[N]; struct Complex
{
double x,y;
Complex(double x_=,double y_=):x(x_),y(y_){}
Complex operator + (Complex P)
{
return Complex(x+P.x,y+P.y);
}
Complex operator - (Complex P)
{
return Complex(x-P.x,y-P.y);
}
Complex operator * (Complex P)
{
return Complex(x*P.x-y*P.y,x*P.y+y*P.x);
}
};
typedef Complex E; E a[N],b[N]; int pos[N]; void fft(E *a,int len,int ty)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int i=;i<len;i<<=)
{
E wn(cos(pi/i),ty*sin(pi/i));
for(int p=i<<,j=;j<len;j+=p)
{
E w(,);
for(int k=;k<i;++k,w=w*wn)
{
E x=a[j+k],y=a[j+k+i]*w;
a[j+k]=x+y; a[j+k+i]=x-y;
}
}
}
if(ty==-)
{
for(int i=;i<len;++i) a[i].x/=len;
}
} int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
int n,m;
scanf("%d%d",&m,&n);
scanf("%s%s",s2,s1);
reverse(s2,s2+m);
for(int i=;i<n;++i)
if(s1[i]!='*') t1[i]=s1[i]-'a'+;
for(int i=;i<m;++i)
if(s2[i]!='*') t2[i]=s2[i]-'a'+; int num=n+m-,len=,bit=;
while(len<num) len<<=,bit++;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<bit-); for(int i=;i<n;++i) a[i].x=t1[i]*t1[i]*t1[i],a[i].y=;
for(int i=n;i<len;++i) a[i].x=a[i].y=;
for(int i=;i<m;++i) b[i].x=t2[i],b[i].y=;
for(int i=m;i<len;++i) b[i].x=b[i].y=;
fft(a,len,); fft(b,len,);
for(int i=;i<len;++i) a[i]=a[i]*b[i];
fft(a,len,-);
for(int i=;i<num;++i) f[i]+=a[i].x; for(int i=;i<n;++i) a[i].x=t1[i],a[i].y=;
for(int i=n;i<len;++i) a[i].x=a[i].y=;
for(int i=;i<m;++i) b[i].x=t2[i]*t2[i]*t2[i],b[i].y=;
for(int i=m;i<len;++i) b[i].x=b[i].y=;
fft(a,len,); fft(b,len,);
for(int i=;i<len;++i) a[i]=a[i]*b[i];
fft(a,len,-);
for(int i=;i<num;++i) f[i]+=a[i].x; for(int i=;i<n;++i) a[i].x=t1[i]*t1[i],a[i].y=;
for(int i=n;i<len;++i) a[i].x=a[i].y=;
for(int i=;i<m;++i) b[i].x=t2[i]*t2[i],b[i].y=;
for(int i=m;i<len;++i) b[i].x=b[i].y=;
fft(a,len,); fft(b,len,);
for(int i=;i<len;++i) a[i]=a[i]*b[i];
fft(a,len,-);
for(int i=;i<num;++i) f[i]-=a[i].x*; int ans=;
for(int i=;i+m-<n;++i)
if(f[i+m-]<0.5) pos[++ans]=i;
printf("%d\n",ans);
for(int i=;i<=ans;++i) printf("%d ",pos[i]+);
}
bzoj千题计划301:bzoj4259: 残缺的字符串的更多相关文章
- bzoj千题计划299:bzoj1856: [Scoi2010]字符串
http://www.lydsy.com/JudgeOnline/problem.php?id=1856 卡特兰数 从(1,1)走到(n,m),不能走y=x 上方的点,求方案数 从(1,1)走到(n, ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
随机推荐
- TortoiseSvn/Git的WaterEffect
https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/MiscUI/WaterEffect.cpp C#的实现: http: ...
- What Is Apache Hadoop
What Is Apache Hadoop? The Apache™ Hadoop® project develops open-source software for reliable, scala ...
- VS Code 的常用快捷键和插件
VS Code 的常用快捷键和插件 一.vs code 的常用快捷键 1.注释: a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] ...
- DispatcherServlet源码分析
一.客户端发送请求的总体过程 DispatcherServlet是SpringMVC的入口,DispatcherServlet其实也是一个Servlet.服务器处理客户端请求的步骤如下: 1.客户端发 ...
- 操作系统+编程语言的分类+执行python程序的两种方式+变量
1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...
- MySQL_基础知识
-----基础知识 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 2.什么是关系型数据库.主键,外键,索引分别是什么? 关系型数据 ...
- python之使用smtplib模块发送邮件
# 使用smtplib模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Heade ...
- python 从filelist.txt中拷贝文件到另一文件夹中
#! python #coding:utf-8 ##!/usr/bin/python # Filename : fileCp.py import sys import os import shutil ...
- 学习笔记之form表单
form表单提交的数据 是字典类型 这样 方便在create时候 直接解压
- BZOJ5093 图的价值(NTT+斯特林数)
显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...