【CF528D】Fuzzy Search(FFT)
【CF528D】Fuzzy Search(FFT)
题面
给定两个只含有\(A,T,G,C\)的\(DNA\)序列
定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符\(c\),问给定串\(T\)在\(S\)中出现了几次。
\(|S|,|T|,K<=200000\)
题解
字符集很小,可以分开进行\(FFT\)。
现在的匹配的定义为距离当前位置\(K\)以内的所有字符中是否含有这个字符,如果有设置为\(1\),没有就是\(0\),把字符分开做\(FFT\)然后相加,检查是否等于\(|T|\)即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 888888
const double Pi=acos(-1);
struct Complex{double a,b;}A[MAX],B[MAX],W[MAX];
Complex operator+(Complex a,Complex b){return (Complex){a.a+b.a,a.b+b.b};}
Complex operator-(Complex a,Complex b){return (Complex){a.a-b.a,a.b-b.b};}
Complex operator*(Complex a,Complex b){return (Complex){a.a*b.a-a.b*b.b,a.b*b.a+a.a*b.b};}
int r[MAX],N,n,m,l,K;
int ss[4][MAX],Ans[MAX];
char S[MAX],T[MAX],Box[4]={'A','T','G','C'};
void FFT(Complex *P,int opt)
{
for(int i=1;i<N;++i)if(i<r[i])swap(P[i],P[r[i]]);
for(int i=1;i<N;i<<=1)
for(int p=i<<1,j=0;j<N;j+=p)
for(int k=0;k<i;++k)
{
Complex w=(Complex){W[N/i*k].a,W[N/i*k].b*opt};
Complex X=P[j+k],Y=w*P[i+j+k];
P[j+k]=X+Y;P[i+j+k]=X-Y;
}
if(opt==-1)for(int i=0;i<N;++i)P[i].a/=N;
}
void Clear(){for(int i=0;i<N;++i)A[i].a=B[i].a=A[i].b=B[i].b=0;}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(N=1;N<=(n+m-2);N<<=1)++l;
for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
for(int i=1;i<N;i<<=1)
for(int k=0;k<i;++k)W[N/i*k]=(Complex){cos(k*Pi/i),sin(k*Pi/i)};
scanf("%s",S);scanf("%s",T);
for(int i=1;i<=n;++i)
for(int k=0;k<4;++k)
if(S[i-1]==Box[k])ss[k][i]++;
for(int i=1;i<=n;++i)
for(int k=0;k<4;++k)ss[k][i]+=ss[k][i-1];
for(int k=0;k<4;++k)
{
Clear();
for(int i=0;i<n;++i)
if(ss[k][min(n,i+K+1)]-ss[k][max(0,i-K)])
A[i].a=1;
for(int i=0;i<m;++i)
if(T[m-i-1]==Box[k])B[i].a=1;
FFT(A,1);FFT(B,1);
for(int i=0;i<N;++i)A[i]=A[i]*B[i];
FFT(A,-1);
for(int i=m-1;i<n;++i)Ans[i-m+1]+=(int)(A[i].a+0.5);
}
int ans=0;
for(int i=0;i<n;++i)if(Ans[i]==m)++ans;
printf("%d\n",ans);
return 0;
}
【CF528D】Fuzzy Search(FFT)的更多相关文章
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 洛谷P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: ...
- 洛谷 P3803 【模板】多项式乘法(FFT)
题目链接:P3803 [模板]多项式乘法(FFT) 题意 给定一个 \(n\) 次多项式 \(F(x)\) 和一个 \(m\) 次多项式 \(G(x)\),求 \(F(x)\) 和 \(G(x)\) ...
- 【luogu P3803】【模板】多项式乘法(FFT)
[模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...
- 【BZOJ3527】[ZJOI2014] 力(FFT)
题目: BZOJ3527 分析: FFT应用第一题-- 首先很明显能把\(F_j\)约掉,变成: \[E_j=\sum _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- 【数学】快速傅里叶变换(FFT)
快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...
- B - Fuzzy Search (FFT)
题目链接:https://cn.vjudge.net/contest/281959#problem/B 题目大意:给你n,m,k.然后输入两个字符串,n代表第一个字符串s1,m代表第二个字符串s2,然 ...
- 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)
题目链接 \(\Huge\text{无图,慎入}\) \(FFT\)即快速傅里叶变换,用于加速多项式乘法. 如果暴力做卷积的话就是一个多项式的每个单项式去乘另一个多项式然后加起来,时间复杂度为\(O( ...
- Codeforces 528D Fuzzy Search(FFT)
题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...
随机推荐
- NPOI读取Excel到集合对象
之前做过的项目中有个需要读取Excel文件内容的需求,因此使用NPOI实现,写下以下代码,这个只是一个代码段,还有很多地方需要优化,希望能对大家有所帮助 public static IList< ...
- scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)
python版本 python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...
- Eclipse 无法编译 或 提示“错误: 找不到或无法加载主类”
project显示一个红色叹号,通常是.jar文件缺失,在下面找到配置 在libraries中添加add External JARs添加.jar文件
- Linux文件归档和解压缩
1.tar tar命令相当于归档,不做压缩,解压同样也是把归档文件释放出来(归档通俗上可以理解为把文件分类,把一些文件放到一个包中归类,方便用户管理) 解包:tar -zxvf file.tar #解 ...
- 工作在Amazon:为何晋升如此难?
英文原文:Why It's So Difficult to Climb Amazon's Corporate Ladder 本文作者 Brad Stone 的新书 The Everything Sto ...
- hbase优化操作与建议
一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...
- ElasticSearch之CURL操作(有空再去整理)
https://www.cnblogs.com/jing1617/p/8060421.html ElasticSearch之CURL操作 CURL的操作 curl是利用URL语法在命令行方式下工 ...
- 模仿qq列表信息滑动删除效果
这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuVi ...
- 团队Alpha冲刺(四)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:何家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员:何宇恒 展示组内最新 ...
- hdu1242 Rescue DFS(路径探索题)
这里我定义的路径探索题指 找某路能够到达目的地,每次走都有方向,由于是探索性的走 之后要后退 那些走过的状态都还原掉 地址:http://acm.hdu.edu.cn/showproblem.php? ...