题目传送门

题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图

能容错的距离不超过$K$,求能$T$被匹配上的次数

$S$串同一个位置可以被$T$的不同位置匹配多次

对4种字符分别处理,假设我们现在只讨论字符A

对于字符串AGCAATTCAT,字符A的生成函数就是1001100010

题目要求距离不超过K就能匹配,把周围距离不超过$K$的位置都变成1,形成一个新串$S'$

$S$  1001100010

$S'$ 1111110111

只要$T$和$S'$的某个子串匹配时,子串中1的个数 不少于 $T$串中1的个数,就表明$T$串能被匹配上

把$T$串反转,再进行卷积,每一位都分4钟情况讨论即可

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 (1<<19)
#define il inline
#define dd double
#define ld long double
#define ll long long
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int idx(char c)
{
if(c=='A') return ;
if(c=='C') return ;
if(c=='G') return ;
if(c=='T') return ;
}
const int inf=0x3f3f3f3f; namespace FFT{ const dd pi=acos(-);
struct cp{
dd x,y;
friend cp operator + (const cp &s1,const cp &s2){ return (cp){s1.x+s2.x,s1.y+s2.y}; }
friend cp operator - (const cp &s1,const cp &s2){ return (cp){s1.x-s2.x,s1.y-s2.y}; }
friend cp operator * (const cp &s1,const cp &s2){ return (cp){s1.x*s2.x-s1.y*s2.y,s1.y*s2.x+s1.x*s2.y}; }
}a[N1],b[N1],c[N1];
int r[N1];
void FFT(cp *s,int len,int type)
{
int i,j,k; cp wn,w,t;
for(i=;i<len;i++) if(i<r[i]) swap(s[i],s[r[i]]);
for(k=;k<=len;k<<=)
{
wn=(cp){cos(2.0*type*pi/k),sin(2.0*type*pi/k)};
for(i=;i<len;i+=k)
{
w=(cp){,};
for(j=;j<(k>>);j++,w=w*wn)
{
t=w*s[i+j+(k>>)];
s[i+j+(k>>)]=s[i+j]-t;
s[i+j]=s[i+j]+t;
}
}
}
}
void Main(int len,int L)
{
int i;
for(i=;i<len;i++) r[i]=(r[i>>]>>)|((i&)<<(L-));
FFT(a,len,); FFT(b,len,);
for(i=;i<len;i++) c[i]=a[i]*b[i];
FFT(c,len,-);
for(i=;i<len;i++) c[i].x/=len;
}
void init()
{
memset(a,,sizeof(a));
memset(b,,sizeof(b));
} };
using FFT::a; using FFT::b; using FFT::c; int s[N1],t[N1],nt[N1],n,m,K,len,L;
char S[N1],T[N1];
void solve(int p)
{
FFT::init();
int i,j,k,num=;
for(i=,k=;i<n;i++) if(s[i]==p)
for(k=max(k,i-K);k<=min(n,i+K);k++) a[k].x=;
for(i=n-,k=n-;i;i--) if(s[i]==p)
for(k=min(k,i+K);k>=max(,i-K);k--) a[k].x=;
for(i=;i<m;i++) if(t[i]==p) b[m-i-].x=,num++;
FFT::Main(len,L);
for(i=;i<n;i++) if((int)(c[i].x+0.1)<num) nt[i]=;
} int main()
{
int i,j,ans=;
scanf("%d%d%d",&n,&m,&K);
scanf("%s",S); scanf("%s",T);
for(i=;i<n;i++) s[i]=idx(S[i]);
for(i=;i<m;i++) t[i]=idx(T[i]);
for(len=,L=;len<(n+m-);len<<=,L++);
solve();
solve();
solve();
solve();
for(i=;i<n;i++) if(!nt[i]) ans++;
printf("%d\n",ans);
return ; }

CF528D Fuzzy Search (生成函数+FFT)的更多相关文章

  1. CF528D. Fuzzy Search [FFT]

    CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...

  2. 【CF528D】Fuzzy Search(FFT)

    [CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...

  3. CF-528D Fuzzy Search(FFT字符串匹配)

    Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹 ...

  4. CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串

    Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...

  5. CF528D Fuzzy Search 字符串匹配+FFT

    题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...

  6. Codeforces 528D Fuzzy Search(FFT)

    题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...

  7. CodeForces 528D Fuzzy Search 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8782849.html 题目传送门 - CodeForces 528D 题意 给你两个串$A,B(|A|\geq| ...

  8. CF528D Fuzzy Search

    题意:给定k,只含有ACGT的字符串S和T,求T在S中出现了多少次. 字符匹配:如果S的[i - k, i + k]中有字符x,那么第i位可以匹配x. 解: 首先预处理:f[i][j]表示S的第i位能 ...

  9. CF528D Fuzzy Search 【NTT】

    题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...

随机推荐

  1. snmptrap、snmpinform和snmptrapd的详细介绍及其用法

    http://blog.csdn.net/reille/article/details/8712087

  2. ExpressionTreeVisualizer

    看表达式的工具,这个工具后来微软不更新了,只支持到VS2013 表达式树的语法难度太大,语法和实现难度都大 相关文章 github地址

  3. [Cypress] Test React’s Controlled Input with Cypress Selector Playground

    React based applications often use controlled inputs, meaning the input event leads to the applicati ...

  4. java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

    泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.ge ...

  5. LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)

    和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...

  6. POJ1837 Balance 背包

    题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子(每个钩子有相对于中心的距离,左负右正),有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数. 将每个砝码看作一组,组内各个物品 ...

  7. 谷歌浏览器(chrome) —— 扩展应用程序

    工具的使用--谷歌浏览器(chrome) (二) 1. 设置和下载方法 右上角菜单按钮 ⇒ 更多工具(more tools) ⇒ 扩展(Extensions) 打开该页面之后,会首先进入扩展(已安装应 ...

  8. Redis Sentinel哨兵配置

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...

  9. [MVC.NET] Asp.Net MVC3 简单入门第一季

    转自:http://www.cnblogs.com/fly_dragon/archive/2011/10/12/2208042.html 初识Asp.Net MVC2.0 初识Asp.Net MVC2 ...

  10. Redis位图法记录在线用户的状态

    Redis位图法记录在线用户的状态 位图 Redis官方文档对于位图的介绍如下: 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且 ...