Fuzzy Search
题意:
考虑模板串B和给定串A,给定K,对于模板串上给定位置j的字符,如果能在给定串上i左右K个字符内找到相同字符,则说可以匹配。
问有多少匹配。
解法:
考虑对于每一种字符分开求。
对于当前字符ch,将B串中为此字符的位置标为1其他位置为0,将A串中所有可以匹配ch的位置标为1,其他为0,这样
记$c_i$表示以 i 为起点字符ch可以匹配到几个。
$$c_i = \sum_{ 0 \leq j<m} { b_j a_{i+j} }$$
$$c_i = \sum_{0 \leq k \leq i+m} {revb_k a_{m+i-k}}$$
卷积即可。
#include <bits/stdc++.h> #define PI acos(-1) const int N = ; using namespace std; struct EX
{
double real,i;
EX operator+(const EX tmp)const{return (EX){real+tmp.real, i+tmp.i};};
EX operator-(const EX tmp)const{return (EX){real-tmp.real, i-tmp.i};};
EX operator*(const EX tmp)const{return (EX){real*tmp.real - i*tmp.i, real*tmp.i + i*tmp.real};};
}; int R[N<<]; void DFT(EX a[],int n,int tp_k)
{
for(int i=;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);
for(int d=;d<n;d<<=)
{
EX wn = (EX){cos(PI/d), sin(PI/d)*tp_k};
for(int i=;i<n;i += (d<<))
{
EX wt = (EX){,};
for(int k=;k<d;k++, wt = wt*wn)
{
EX A0 = a[i+k], A1 = wt * a[i+k+d];
a[i+k] = A0+A1;
a[i+k+d] = A0-A1;
}
}
}
if(tp_k==-)
for(int i=;i<n;i++) a[i] = (EX){a[i].real/n, a[i].i/n};
} int n,m,K;
EX A[N<<],B[N<<],C[N<<];
char S[N],S2[N];
bool del[N]; void calc(char ch,int tot)
{
memset(B,,sizeof(B));
memset(A,,sizeof(A));
int cnt_S2 = ;
for(int i=;i<m;i++) if(S2[i]==ch) B[m-i] = (EX){,}, cnt_S2++;
int tp = -;
for(int i=;i<n;i++)
{
if(S[i]==ch) tp = i;
if(tp!=- && i-tp<=K) A[i] = (EX){,};
}
tp = -;
for(int i=n-;i>=;i--)
{
if(S[i]==ch) tp = i;
if(tp!=- && tp-i<=K) A[i] = (EX){,};
}
DFT(A,tot,);
DFT(B,tot,);
for(int i=;i<tot;i++) C[i] = A[i]*B[i];
DFT(C,tot,-);
for(int i=;i<n;i++)
{
int tmp = C[i+m].real+0.5;
if(tmp<cnt_S2) del[i] = ;
}
} int main()
{
scanf("%d%d%d",&n,&m,&K);
scanf("%s%s",S,S2);
int L = ,tot;
while((<<L)<n+m) L++;
tot = (<<L);
for(int i=;i<tot;i++) R[i]=(R[i>>]>>)|((i&)<<(L-));
calc('A',tot);
calc('T',tot);
calc('C',tot);
calc('G',tot);
int ans = ;
for(int i=;i<=n-m;i++) if(!del[i]) ans++;
printf("%d\n",ans);
return ;
}
Fuzzy Search的更多相关文章
- CF528D. Fuzzy Search [FFT]
CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...
- CF 528D. Fuzzy Search NTT
CF 528D. Fuzzy Search NTT 题目大意 给出文本串S和模式串T和k,S,T为DNA序列(只含ATGC).对于S中的每个位置\(i\),只要中[i-k,i+k]有一个位置匹配了字符 ...
- 【Codeforces528D】Fuzzy Search FFT
D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard inp ...
- 【CF528D】Fuzzy Search(FFT)
[CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...
- Umbraco Examine 实现Fuzzy search
在Umbraco examine search项目开发中,有一个需求, 就是intercom 和 intercoms需要返回同样的结果 也就是说 搜索intercom 时, 能返回包含intercom ...
- CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...
- CF-528D Fuzzy Search(FFT字符串匹配)
Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹 ...
- codeforces 528D Fuzzy Search
链接:http://codeforces.com/problemset/problem/528/D 正解:$FFT$. 很多字符串匹配的问题都可以用$FFT$来实现. 这道题是要求在左边和右边$k$个 ...
- Codeforces 528D Fuzzy Search(FFT)
题目 Source http://codeforces.com/problemset/problem/528/D Description Leonid works for a small and pr ...
- ●codeforces 528D Fuzzy Search
题链: http://codeforces.com/problemset/problem/528/D 题解: FFT 先解释一下题意: 给出两个字符串(只含'A','T','C','G'四种字符),一 ...
随机推荐
- C语言-回溯例1
回溯法解N皇后问题 1,代码分析: 使用一个一维数组表示皇后的位置 其中数组的下标表示皇后所在的行 数组元素的值表示皇后所在的列 这样设计的棋盘,所有皇后必定不在同一行 假设前n-1行的皇后已经按照规 ...
- 小贝_mysql主从复制作用以及案例
mysql主从复制 简要: 一.mysql用户授权 二.mysql bin-log日志 三.mysql主从复制 一.mysql用户授权 1.命令 2.作用:进行权限控制 3.样例: (备注: 同意 ...
- Android Studio 那些事|Activity文件前标识图标显示为 j 而是 c
问题:Activity文件前标识图标显示为 j 而是 c 的图标,或是没有显示,并且自己主动提示不提示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/fo ...
- D3js-API介绍【英】
Everything in D3 is scoped under the d3 namespace. D3 uses semantic versioning. You can find the cur ...
- 话说Session
Session这个概念,对于搞软件的来说,再熟悉不过了.就拿我来说,Hibernate, Shiro, Spring, JSP, Web Server等等,全都涉及到Session. 不怕笑话,一直都 ...
- 顺序容器vector,deque,list的选用规则
前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...
- 最新版本号MYSQL官网下载地址可是必需要注冊后才干下载
因mysql5.0上运行函数不行,决定安装最新版本号的mysql,在网上找了些绿色版的.安装总报1067错误,网上的各种方法都试了,就是不行.浪费时间不说.郁闷死了,最后决定去官网,官 ...
- Srvctl命令具体解释(10g)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lovedieya/article/details/28169481 Srvctl命令 Srvct ...
- mac svn命令 linux同样适用
1.将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/domain简写:svn ...
- 【网络基础系列二】BOOTP、DHCP协议
BOOTP 含义:BOOT Protocol,引导协议 作用:引导无盘计算机或者第一次启动的计算机获取以下网络配置信息: 主机的IP地址.子网掩码 路由器(网关)的IP地址 DNS服务器IP地址 C/ ...