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: 残缺的字符串的更多相关文章

  1. bzoj千题计划299:bzoj1856: [Scoi2010]字符串

    http://www.lydsy.com/JudgeOnline/problem.php?id=1856 卡特兰数 从(1,1)走到(n,m),不能走y=x 上方的点,求方案数 从(1,1)走到(n, ...

  2. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  5. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  6. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  7. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  8. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  9. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

随机推荐

  1. How To Install MySQL on Ubuntu 16.04

    https://help.ubuntu.com/lts/serverguide/mysql.html http://www.cnblogs.com/wuhou/archive/2008/09/28/1 ...

  2. Spring框架最简单的定时任务调用

    package org.jeecgframework.core.timer; import org.springframework.scheduling.annotation.Scheduled; i ...

  3. Notepad++ 大小写转换

    code_field_text 普通文本 code_field_user_id 用户ID code_field_customer_id 客户ID code_field_dict 数据字典 code_f ...

  4. 安装rlwrap 的简单方法

    1. 下载安装 epel包 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 2. 安装r ...

  5. 小程序的wx.onAccelerometerChange

    https://www.2cto.com/kf/201802/724174.html(copy) 也许有人会问,小程序中都是竖直app形态,要横竖屏判断有什么用?即使判断出了横屏状态,你能把小程序横过 ...

  6. VMware安装win7提示 operating system not found

    在虚拟机上安装win7时,进度条读完,重启后提示operating system not found,可能原因是在使用分区工具格式化时没有把C盘设置为主分区并激活. 解决办法: 进入PE或者使用分区工 ...

  7. centos7 tar.xz格式文件的解压方法

    现在很多找到的软件都是tar.xz的格式的,xz 是一个使用 LZMA压缩算法的无损数据压缩文件格式. 和gzip与bzip2一样,同样支持多文件压缩,但是约定不能将多于一个的目标文件压缩进同一个档案 ...

  8. DOM 操作技术【JavaScript高级程序设计第三版】

    很多时候,DOM 操作都比较简明,因此用JavaScript 生成那些通常原本是用HTML 代码生成的内容并不麻烦.不过,也有一些时候,操作DOM 并不像表面上看起来那么简单.由于浏览器中充斥着隐藏的 ...

  9. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  10. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...