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了一发 最 ...
随机推荐
- @Autowired的使用:推荐对构造函数进行注释
在编写代码的时候,使用@Autowired注解是,发现IDE报的一个警告,如下: Spring Team recommends "Always use constructor based d ...
- python对redis的常用操作 上 (对列表、字符串、散列结构操作)
这里的一切讨论均基于python的redis-py库. 安装使用: pip install redis 然后去获取一个redis客户端: redis_conn = redis.Redis(host=R ...
- JavaScript——事件机制
事件是将JavaScript脚本与网页联系在一起的主要方式,是JavaScript中最重要的主题之一,深入理解事件的工作机制以及它们对性能的影响至关重要.本文将详细介绍JavaScript的事件机制, ...
- KEYENCE Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- Web api dynamic
参考: ajax调用实例 <script> var user = { name_CN: "haha", pwd: "123" ...
- day22 ramdom 模块
import random #随机整数 random.randint(1,5) # 大于等于1且小于等于5之间的整数 random.randrange(1,10,2) # 大于等于1且小于10之间的奇 ...
- 【POJ 2823】Sliding Window(单调队列/堆)
BUPT2017 wintertraining(16) #5 D POJ - 2823 题意 给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值. 题解 单调队列或堆. ...
- .htaccess 配置
常规wordpress配置 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ ...
- OpenAI 开源机器人模拟 Python 库,并行模拟处理速度提升400%
10000da.cnvboyule.cnjiaeidaypt.cn 在过去一年的研究中,OpenAI团队开源一个使用 MuJoCoengine开发的用于机器人模拟的高性能Python库.雷锋网了解到 ...
- Leetcode 371.两整数之和 By Python
不使用运算符 + 和 - ,计算两整数 a .b 之和. 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = 3 输出: 1 思路 比如\(5+6=1 ...