CF528D Fuzzy Search 字符串匹配+FFT
题意:
DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c。求有多少个位置匹配了t。
分析:
这个字符串匹配的方式,什么kmp,各种自动机都不灵。
所以有一个邪门功夫,fft字符串匹配。(做过洛谷《残缺的字符串》一题的应该都不陌生,带通配符的匹配字符串可以用fft卷积来做)
首先,由于字符集大小只有4,所以我们可以对每个字符分别考虑。
根据题意,对于每个字符,我们预处理a[i]数组,代表i位置是否能匹配当前字符(左右k个能匹配也算)
之后b[i]数组,保存t[i]位置的字符是不是c。
然后将b数组倒过来,fft做一下卷积,把答案累计起来检查总和是不是m就可以判断是否匹配。
代码:
#include<bits/stdc++.h>
#define db double
#define cp complex<db>
using namespace std;
const int N=;
const db pi=acos(-);
int ans,ton[N],n,m,k,lm,L,r[N];
char s[N],t[N];cp a[N],b[N];
void init(){
scanf("%d%d%d%s%s",&n,&m,&k,s,t);
} void fft(cp *f,int op){
for(int i=;i<lm;i++)
if(i>r[i]) swap(f[i],f[r[i]]);
for(int l=;l<lm;l<<=){
cp wn(cos(pi/l),op*sin(pi/l));
for(int i=;i<lm;i+=(l<<)){
cp w(,);
for(int j=;j<l;j++,w*=wn){
cp T=w*f[i+j+l];
f[i+j+l]=f[i+j]-T;f[i+j]+=T;
}
}
} if(op==-) for(int i=;i<lm;i++) f[i]/=lm;
} void calc(char c){
memset(a,,sizeof(a));memset(b,,sizeof(b));
int cnt=;
for(int i=;i<k;i++) cnt+=(s[i]==c);
for(int i=;i<n;i++){
if(i+k<n) cnt+=(s[i+k]==c);
if(i-k->=) cnt-=(s[i-k-]==c);
a[i]=cnt>?:;cout<<a[i]<<" ";
} for(int i=;i<m;i++) b[i]=(t[i]==c);puts("");
fft(a,);fft(b,);
for(int i=;i<lm;i++) a[i]*=b[i];
fft(a,-);for(int i=;i<=n-m;i++)
ton[i]+=(int)(a[i+m-].real()+0.5);
} void solve(){
for(lm=;lm<=n+m-;lm<<=,L++);
for(int i=;i<lm;i++)
r[i]=(r[i>>]>>)|((i&)<<(L-));
reverse(t,t+m);calc('A');
calc('G');calc('C');calc('T');
for(int i=;i<=n-m;i++) if(ton[i]==m) ans++;
printf("%d\n",ans);
} int main(){
init();solve();return ;
}
fft字符串匹配
CF528D Fuzzy Search 字符串匹配+FFT的更多相关文章
- 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(FFT字符串匹配)
Fuzzy Search 题意: 给定一个模式串和目标串按下图方式匹配,错开位置不多于k 解题思路: 总共只有\(A C G T\)四个字符,那么我们可以按照各个字符进行匹配,比如按照\(A\)进行匹 ...
- CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
Fuzzy Search 给你文本串 S 和模式串 T,求 S 的每个位置是否能模糊匹配上 T. 这里的模糊匹配指的是把 T 放到 S 相应位置上之后,T 中每个字符所在位置附近 k 个之内的位置上的 ...
- CF528D Fuzzy Search (生成函数+FFT)
题目传送门 题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图 能容错的距离不超过$K$,求能$T$被匹配上的次数 $S$串同一个位 ...
- CF528D Fuzzy Search
题意:给定k,只含有ACGT的字符串S和T,求T在S中出现了多少次. 字符匹配:如果S的[i - k, i + k]中有字符x,那么第i位可以匹配x. 解: 首先预处理:f[i][j]表示S的第i位能 ...
- CF528D Fuzzy Search 【NTT】
题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...
- 【CF528D】Fuzzy Search(FFT)
[CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- 【Codeforces528D】Fuzzy Search FFT
D. Fuzzy Search time limit per test:3 seconds memory limit per test:256 megabytes input:standard inp ...
随机推荐
- TCP协议深度刨析
这篇文章主要是详细说明TCP的拥塞控制,因为它对于我们理解整个TCP/IP协议栈非常重要,但我个人能力有限,其中引用了很多网上其他博主的文章,在下文引用处都有说明,主要是让整篇文章能够连贯,不至于让所 ...
- iptables 使用总结
Linux 系统的防火墙功能是由内核实现的 2.0 版内核中,包过滤机制是 ipfw,管理工具是 ipfwadm 2.2 版内核中,包过滤机制是 ipchain,管理工具是 ipchains 2.4 ...
- 最短路之Floyd(弗洛伊德)
只有五行的Floyd最短路算法: 核心代码 每次都更新通过k点,然后从i到j的最短路程...
- iOS 跷跷板动画 Seesaw Animation
Xcode Playgound示例代码: let testView = UIView() testView.frame = CGRect.init(x: , y: , width: , height: ...
- SpringBoot | 读取配置文件信息
server.port=8081 #修改端口号 server.servlet.context-path= /SpringBoot #修改URL #自定义配置 tz.name = xiaoming tz ...
- HDU - 6063 RXD and math
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6063 打表发现规律是n^k #include <iostream> #inc ...
- 洛谷 P3312 [SDOI2014]数表
式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...
- Node.Js的Module System 以及一些常用 Module
Node.Js学习就按照这本书的流程来. 在第7章结束与第10章结束时分别自己出一个小项目练练手.Node.Js的入门学习计划是这样. 目录:, QQ:1045642972 欢迎来索书以及讨论Node ...
- CF779C(round 402 div.2 C) Dishonest Sellers
题意: Igor found out discounts in a shop and decided to buy n items. Discounts at the store will last ...
- BZOJ3083: 遥远的国度(树链剖分)
题意 $n$个节点的树,每个点有权值,支持三种操作 1. 换根 2.把$x$到$y$路径上节点权值变为$z$ 3.询问路径最小值 Sol 啥?你说这是TopTree的裸题?那你写去啊 很显然,如果没有 ...