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了一发 最 ...
随机推荐
- PDB自动启动以及Oracle Pfile的参数修改示范
1. Oracle12c 可以使用PDB的模式进行创建, 但是他一般不会自动启动,所以可以穿件一个触发器进行处理 创建语句 CREATE TRIGGER open_all_pdbs AFTER STA ...
- React 表单受控组件
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- pandas 级联 concat append
连接的一个有用的快捷方式是在Series和DataFrame实例的append方法.这些方法实际上早于concat()方法. 它们沿axis=0连接 #encoding:utf8 import pan ...
- DevexpressVCL v51
Dev经典套件v49版 支持Delphi2010 DevExpress公司出品的Borland Delphi和C++ Builder的控件(包含完整源代码).ExpressVerticalGrid:就 ...
- js 单项链表
介绍链表 链表是由一组节点组成的集合.每一个节点都使用一个对象的引用指向它的后续借点.指向另外一个借点的引用叫做链. 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组 ...
- Ubuntu16.04 ERROR 1698 (28000): Access denied for user 'root'@'localhost' 解决流程
mysql版本 5.7.22 安装完成后出现问题 ERROR 1698 (28000): Access denied for user 'root'@'localhost' 可能是因为初始密码为空:按 ...
- OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中
如果你想给游戏做个截图功能,或者想把屏幕图像弄成一个纹理,你就非常需要 PBO 了 通常情况下,你想把屏幕图像的像素数据读到内存需要用 glReadPixels 然后 pixels 参数传进去一块内存 ...
- asp.net 的三种开发模式
一, Web Pages 是三种创建 ASP.NET 网站和 Web 应用程序的编程模式中的一种. 其他两种编程模式是 Web Forms 和 MVC(Model View Controller 模型 ...
- BZOJ2819Nim——树链剖分+线段树+Nim游戏
题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- Cuba项目配置IDEA,如何dubug
1.在cuba中编辑端口,如下图: 2.在IDEA中添加一个远程链接,添加为对应的端口号,然后运行debug即可 如果两个端口号不对应,就会报出以下的错误:unable to open debugge ...