博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF528D. Fuzzy Search [FFT]
阅读量:5298 次
发布时间:2019-06-14

本文共 1509 字,大约阅读时间需要 5 分钟。

题意: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 
#include
#include
#include
#include
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
>1]>>1) | ((i&1)<<(k-1)); } void dft(cd *a, int flag) { for(int i=0; i
>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

转载于:https://www.cnblogs.com/candy99/p/6648736.html

你可能感兴趣的文章
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
consonant combination
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Swagger简单介绍
查看>>
sql语句中where与having的区别
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
Linux 中【./】和【/】和【.】之间有什么区别?
查看>>
内存地址对齐
查看>>