CF528D. Fuzzy Search

题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c。求有多少个位置匹配了t


预处理\(f[i][j]\)表示位置i可以匹配字符j
分别考虑每一个字符c,对s的每个位置i求出用\(s[i,i+m-1]\)匹配t,这个字符匹配了几次
用\(a_i=[s的位置i匹配c],\ b_i=[t_i=c]\)
那么c的匹配次数就是\(c_j=\sum\limits_{i=0}^{m-1}a_{j+i}b_i\),位置i匹配了t当且仅当四种字符的匹配次数和等于t的长度m

这时候就可以考虑bitset暴力过了

一个常用技巧是,反转模式串(或母串),然后就成了卷积的形式:
\[ c_j=\sum\limits_{i=0}^{m-1}a_{j+i}b_{m-1-i}=D_{m+j-1} \]
这样计算是没有问题的,因为b只有\([0,m-1]\)有值其他地方为0

注意处理每个字符前memset a和b!!!!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=(1<<20)+5, INF=1e9;
const double PI=acos(-1);
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}struct meow{double x, y;meow(double a=0, double b=0):x(a), y(b){}
};
meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
meow conj(meow a) {return meow(a.x, -a.y);}
typedef meow cd;namespace FFT{int n, rev[N];void ini(int lim) {n=1; int k=0;while(n<lim) n<<=1, k++;for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));}void dft(cd *a, int flag) {for(int i=0; i<n; i++) if(i<rev[i]) swap(a[i], a[rev[i]]);for(int l=2; l<=n; l<<=1) {int m=l>>1; cd wn = meow(cos(2*PI/l), flag*sin(2*PI/l));for(cd *p=a; p!=a+n; p+=l) {cd w(1, 0);for(int k=0; k<m; k++) {cd t = w*p[k+m];p[k+m] = p[k] - t;p[k] = p[k] + t;w=w*wn;}}}if(flag==-1) for(int i=0; i<n; i++) a[i].x/=n;}void mul(cd *a, cd *b) {dft(a, 1); dft(b, 1);for(int i=0; i<n; i++) a[i]=a[i]*b[i];dft(a, -1);}
}using FFT::mul; using FFT::ini;int n, m, k, lim, f[N][5], cnt[5], id[300];
cd a[N], b[N], c[N];
char s[N], t[N];
int ans[N];
void solve(int now) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b));for(int i=0; i<n; i++) a[i].x = f[i][now];for(int i=0; i<m; i++) b[m-1-i].x = id[(int)t[i]]==now; mul(a, b);for(int i=0; i<n; i++) ans[i] += int(a[m-1+i].x+0.5);
}
int main() {freopen("in","r",stdin);n=read(); m=read(); k=read(); lim=n+m-1; ini(lim);scanf("%s%s",s,t);id['A']=0; id['T']=1; id['C']=2; id['G']=3;int l=0, r=0; cnt[ id[(int)s[0]] ]++;for(int i=0; i<n; i++) {while(l<i-k) cnt[ id[(int)s[l++]] ]--;while(r<n-1 && r<i+k) cnt[ id[(int)s[++r]] ]++;for(int j=0; j<4; j++) if(cnt[j]) f[i][j]=1;}for(int i=0; i<4; i++) solve(i);int sum=0;for(int i=0; i<n; i++) if(ans[i]==m) sum++;printf("%d",sum);
}

CF528D. Fuzzy Search [FFT]相关推荐

  1. CF528D Fuzzy Search FFT

    有两个基因串S和T,他们只包含AGCT四种字符.现在你要找出T在S中出现了几次. 有一个门限值k≥0.T在S的第i(1≤i≤|S|-|T|+1)个位置中出现的条件如下:把T的开头和S的第i个字符对齐, ...

  2. Codeforces Round #296 (Div. 1) D. Fuzzy Search FFT匹配字符串

    传送门 文章目录 题意: 思路: 题意: n,m,k≤2e5n,m,k\le2e5n,m,k≤2e5 思路: 直接考虑fftfftfft来匹配字符串. 由于kkk是给定的,所以难度低了很多,普通的字符 ...

  3. codeforces 528D. Fuzzy Search 快速傅里叶变换

    题目链接 D. Fuzzy Search time limit per test 3 seconds memory limit per test 256 megabytes input standar ...

  4. CodeForces - 528D Fuzzy Search(多项式匹配字符串)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,问字符串 sss 有哪些子串可以匹配 ttt.给出一个参数 kkk,TTT 在 SSS ...

  5. CF刷题——2500难度的几道题

    1.D. Beautiful numbers 题意:Beautiful Numbers定义为这个数能整除它的所有位上非零整数.问[l,r]之间的Beautiful Numbers的个数. 数位 DP: ...

  6. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  7. FFT/NTT卷积神级副本

    干货满满的良心博客 传送至只有小怪的村庄--请开始你的逆天之路 A:P1919 B:P4157 刷怪升级--转战玄灵大陆 C:P6300 D:P3763 E:P3321 F:P5641 G:P4986 ...

  8. Liferay:Faceted Search in Liferay 6.1

    Liferay6.1和6.0比,那是灵活性提高了太多. 可以在hook里面适当改改就封装多比较好的功能.下面介绍一下全文检索. 内容来自:http://www.liferay.com/ja/web/r ...

  9. Noip前的大抱佛脚----字符串

    目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...

  10. 前端资源整理 - 订阅、工具等

    取自 我的GITHUB 的 fe-store-house repo,欢迎 PR,欢迎 STAR.原 repo 不定期更新,此文可能断更. 断更了一年多,重新更新一下,似乎 sfgg 的文章渲染中 gf ...

最新文章

  1. ABP中的Filter(下)
  2. java B2B2C电子商务平台分析之八--配置中心svn示例和refresh
  3. java的数据类型如下所示
  4. 在Windows 下使用OpenCL
  5. dj鲜生-20-模版的抽离-base父模板的生产
  6. Atom飞行手册翻译: 2.5 查找和替换
  7. python有哪些用途-python是什么?python的用途
  8. 教你在Windows轻松修改Hosts文件
  9. HTTP数据传输机制的演变:从0.9到3.0
  10. 怎么设置ppt页面的长度和宽度_ppt页面尺寸_ppt尺寸大小的设置方法步骤详解
  11. 舞蹈课 (C++堆的优先级与重载)
  12. Hexo写博客时的图片问题
  13. The Auto-extending innodb_system data file './ibdata1' is of a different size 6400 pages (rounded do
  14. HDU 5804 Price List(水~)
  15. 微商城系统是什么?可以分为哪几类?
  16. 安霸S2L交叉编译环境搭建
  17. 6种原型设计工具大比对! Axure,Invision, 墨刀……哪款适合你?
  18. CEILING函数用法
  19. 【Luogu-P3324 [SDOI2015] / DSY-1993】星际战争
  20. YQ11-25 作业

热门文章

  1. python读取二进制文件_python中读写二进制文件
  2. 总线式布线、差分走线等布线方法
  3. 吊打Navicat?这款神器牛逼了~~ [ 必看 ]
  4. BUG记录 —— JSON转对象部分字段丢失
  5. 利用loic工具进行doss教程(附下载链接官方无后门)
  6. swat模型_文献分享——欧洲大陆尺度水质模型高分辨率大尺度SWAT模型率定及不确定性分析...
  7. Go语言实战--学习笔记--runner
  8. 流程管理思想与方法论(流程的永恒之道——笔记一)
  9. 胶东机场t1离哪个停车场近,青岛胶东国际机场停车场攻略
  10. word模板中替换文本中自定义字符串生成月报