CF528D Fuzzy Search FFT
有两个基因串S和T,他们只包含AGCT四种字符。现在你要找出T在S中出现了几次。 有一个门限值k≥0。T在S的第i(1≤i≤|S|-|T|+1)个位置中出现的条件如下:把T的开头和S的第i个字符对齐,然后T中的每一个字符能够在S中找到一样的,且位置偏差不超过k的,那么就认为T在S的第i个位置中出现。也就是说对于所有的 j (1≤j≤|T|),存在一个 p (1≤p≤|S|),使得|(i+j-1)-p|≤k 和[p]=T[j]都成立。 例如,根据这样的定义"ACAT"出现在"AGCAATTCAT"的第2,3和6的位置。
如果k=0,那么这个就是经典的字符串匹配问题。 现在给定门限和两个基因串S,T,求出T在S中出现的次数。
Input 单组测试数据。 第一行有三个整数 |S|,|T|,k (1≤|T|≤|S|≤200000, 0≤k≤200000),表示S的长度,T的长度,门限值。 第二行给出基因串S。 第三行给出基因串T。 两个串都只包含大写字母'A', 'T', 'G' 和'C'。 Output 输出一个整数,表示T在S中出现的次数。
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define ll long long
#define maxn 800002
using namespace std;
const double pi=acos(-1.0);
inline int get(char c)
{if(c=='A') return 1; if(c=='T') return 2; if(c=='G') return 3; if(c=='C') return 4;
}
struct cpx
{double x,y; cpx(double a=0,double b=0) {x=a,y=b; } cpx operator+(const cpx b) { return cpx(x+b.x,y+b.y); } cpx operator-(const cpx b) { return cpx(x-b.x,y-b.y); } cpx operator*(const cpx b) { return cpx(x*b.x-y*b.y,x*b.y+y*b.x); }
}A[maxn],B[maxn];
void FFT(cpx *a,int n,int flag)
{for(int i=0,k=0;i<n;++i) {if(i>k) swap(a[i],a[k]); for(int j=(n>>1);(k^=j)<j;j>>=1); }for(int mid=1;mid<n;mid<<=1) { cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y; for(int i=0;i<n;i+=(mid<<1)) {cpx w(1,0); for(int j=0;j<mid;++j) {x=a[i+j], y=w*a[i+j+mid]; a[i+j]=x+y,a[i+j+mid]=x-y; w=w*wn; }}}if(flag==-1) for(int i=0;i<n;++i) a[i].x/=(double)n;
}
int len_s,len_t,k;
int a[10][maxn],b[10][maxn],answer[10][maxn];
int S[maxn],T[maxn];
char srr[maxn],trr[maxn];
inline void Initialize(int h)
{int cnt=0; for(int i=0;i<len_s;++i) { cnt+=(S[i]==h); if(i-k-1>=0) cnt-=(S[i-k-1]==h); if(cnt) a[h][i]=1; } cnt=0; for(int i=len_s-1;i>=0;--i) {cnt+=(S[i]==h); if(i+k+1<len_s) cnt-=(S[i+k+1]==h); if(cnt) a[h][i]=1; }
}
inline void solve(int h,int len)
{ for(int i=0;i<len;++i) A[i].x=A[i].y=B[i].x=B[i].y=0; for(int i=0;i<len;++i) A[i].x=a[h][i]; for(int i=0;i<len;++i) B[i].x=b[h][len_t-1-i];FFT(A,len,1),FFT(B,len,1); for(int i=0;i<len;++i) A[i]=A[i]*B[i]; FFT(A,len,-1); for(int i=0;i<len_s;++i) answer[h][i]=(ll)(A[len_t-1+i].x+0.5);
}
int main()
{// setIO("input"); scanf("%d%d%d",&len_s,&len_t,&k); scanf("%s%s",srr,trr); for(int i=0;i<len_s;++i) S[i]=get(srr[i]); for(int i=0;i<len_t;++i) T[i]=get(trr[i]);for(int i=0;i<len_t;++i) b[T[i]][i]=1; for(int i=1;i<=4;++i) Initialize(i); int len; for(len=1;len<=(len_s+len_t);len<<=1); for(int i=1;i<=4;++i) solve(i,len); int re=0; for(int i=0;i<len_s;++i) if(answer[1][i]+answer[2][i]+answer[3][i]+answer[4][i]>=len_t) ++re; printf("%d\n",re); return 0;
}
转载于:https://www.cnblogs.com/guangheli/p/11170862.html
CF528D Fuzzy Search FFT相关推荐
- Codeforces Round #296 (Div. 1) D. Fuzzy Search FFT匹配字符串
传送门 文章目录 题意: 思路: 题意: n,m,k≤2e5n,m,k\le2e5n,m,k≤2e5 思路: 直接考虑fftfftfft来匹配字符串. 由于kkk是给定的,所以难度低了很多,普通的字符 ...
- codeforces 528D. Fuzzy Search 快速傅里叶变换
题目链接 D. Fuzzy Search time limit per test 3 seconds memory limit per test 256 megabytes input standar ...
- CodeForces - 528D Fuzzy Search(多项式匹配字符串)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,问字符串 sss 有哪些子串可以匹配 ttt.给出一个参数 kkk,TTT 在 SSS ...
- CF刷题——2500难度的几道题
1.D. Beautiful numbers 题意:Beautiful Numbers定义为这个数能整除它的所有位上非零整数.问[l,r]之间的Beautiful Numbers的个数. 数位 DP: ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- FFT/NTT卷积神级副本
干货满满的良心博客 传送至只有小怪的村庄--请开始你的逆天之路 A:P1919 B:P4157 刷怪升级--转战玄灵大陆 C:P6300 D:P3763 E:P3321 F:P5641 G:P4986 ...
- Liferay:Faceted Search in Liferay 6.1
Liferay6.1和6.0比,那是灵活性提高了太多. 可以在hook里面适当改改就封装多比较好的功能.下面介绍一下全文检索. 内容来自:http://www.liferay.com/ja/web/r ...
- Noip前的大抱佛脚----字符串
目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...
- 前端资源整理 - 订阅、工具等
取自 我的GITHUB 的 fe-store-house repo,欢迎 PR,欢迎 STAR.原 repo 不定期更新,此文可能断更. 断更了一年多,重新更新一下,似乎 sfgg 的文章渲染中 gf ...
最新文章
- vue2.0实现底部导航切换效果
- automation服务器不能创建对象的问题
- linux 内存交换参数,Ubuntu Linux:处理交换内存和内存使用情况
- 【django】视图和URL
- python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
- npm和yarn的区别,我们该如何选择?
- 这位挪威博士是如何成为阿里云PolarDB资深架构师的?
- data source from bit.ly
- 安卓微软雅黑字体ttf_618巨献丨精致的悦黑5字重小字体
- hadoop退出安全模式Name node is in safe mode
- mysql concat 索引_mysql-查看数据库、索引、表大小
- 【MFC开发(6)】复选框按钮控件Check Box
- cdlinux 无线网密码破解
- ac管理器管理员密码忘记了_你应该使用密码管理器吗
- Linux 误删除文件恢复
- 利用jquery-ajax实现局部刷新
- BigWorld文件夹结构
- JavaSE-饿了么项目实战
- Win10关闭登录面板毛玻璃效果
- Hadoop 百度百科
热门文章
- 黑龙江哪家学校学计算机好,黑龙江省内哪个专科学校计算机专业比较好?
- Android蓝牙串口绘图器,DIY蓝牙模块+processing互动型绘图机械臂(arduino)
- 浙江 二本 计算机 招聘,在浙江招收二本的外省好学校
- 摔跤吧爸爸-影评感悟(匍匐泥泞,不忘星空-目标)
- 日本浮世绘的艺术配色
- 1.5V升3V一节锂电池提供5V300mA
- ATTCK v10版本战术介绍-初始访问
- 管理软件Jira Service Desk使用教程之如何将Jira Cloud用于Slack?
- 张维迎:知识的本质与企业家精神
- 《请君入瓮——APT攻防指南之兵不厌诈》—第8章8.4节欺骗技术