当前位置: 首页 > news >正文

CF528D Fuzzy Search (生成函数+FFT)

题目传送门

题目大意:给你两个只包含A,G,C,T的字符串$S$,$T$,$S$长$T$短,按照如下图方式匹配 解释不明白直接上图

能容错的距离不超过$K$,求能$T$被匹配上的次数

$S$串同一个位置可以被$T$的不同位置匹配多次

 

对4种字符分别处理,假设我们现在只讨论字符A

对于字符串AGCAATTCAT,字符A的生成函数就是1001100010

题目要求距离不超过K就能匹配,把周围距离不超过$K$的位置都变成1,形成一个新串$S'$

$S$  1001100010

$S'$ 1111110111

只要$T$和$S'$的某个子串匹配时,子串中1的个数 不少于 $T$串中1的个数,就表明$T$串能被匹配上

把$T$串反转,再进行卷积,每一位都分4钟情况讨论即可

 

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define N1 (1<<19)
  6 #define il inline
  7 #define dd double
  8 #define ld long double
  9 #define ll long long
 10 using namespace std;
 11 
 12 int gint()
 13 {
 14     int ret=0,fh=1;char c=getchar();
 15     while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
 16     while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
 17     return ret*fh;
 18 }
 19 int idx(char c)
 20 {
 21     if(c=='A') return 0;
 22     if(c=='C') return 1;
 23     if(c=='G') return 2;
 24     if(c=='T') return 3;
 25 }
 26 const int inf=0x3f3f3f3f;
 27 
 28 namespace FFT{
 29 
 30 const dd pi=acos(-1);
 31 struct cp{
 32 dd x,y;
 33 friend cp operator + (const cp &s1,const cp &s2){ return (cp){s1.x+s2.x,s1.y+s2.y}; }
 34 friend cp operator - (const cp &s1,const cp &s2){ return (cp){s1.x-s2.x,s1.y-s2.y}; }
 35 friend cp operator * (const cp &s1,const cp &s2){ return (cp){s1.x*s2.x-s1.y*s2.y,s1.y*s2.x+s1.x*s2.y}; }
 36 }a[N1],b[N1],c[N1];
 37 int r[N1];
 38 void FFT(cp *s,int len,int type)
 39 {
 40     int i,j,k; cp wn,w,t;
 41     for(i=0;i<len;i++) if(i<r[i]) swap(s[i],s[r[i]]);
 42     for(k=2;k<=len;k<<=1)
 43     {
 44         wn=(cp){cos(2.0*type*pi/k),sin(2.0*type*pi/k)};
 45         for(i=0;i<len;i+=k)
 46         {
 47             w=(cp){1,0};
 48             for(j=0;j<(k>>1);j++,w=w*wn)
 49             {
 50                 t=w*s[i+j+(k>>1)];
 51                 s[i+j+(k>>1)]=s[i+j]-t;
 52                 s[i+j]=s[i+j]+t;
 53             }
 54         }
 55     }
 56 }
 57 void Main(int len,int L)
 58 {
 59     int i;
 60     for(i=0;i<len;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
 61     FFT(a,len,1); FFT(b,len,1);
 62     for(i=0;i<len;i++) c[i]=a[i]*b[i];
 63     FFT(c,len,-1);
 64     for(i=0;i<len;i++) c[i].x/=len;
 65 }
 66 void init()
 67 {
 68     memset(a,0,sizeof(a));
 69     memset(b,0,sizeof(b));
 70 }
 71 
 72 };
 73 using FFT::a; using FFT::b; using FFT::c;
 74 
 75 int s[N1],t[N1],nt[N1],n,m,K,len,L;
 76 char S[N1],T[N1];
 77 void solve(int p)
 78 {
 79     FFT::init();
 80     int i,j,k,num=0;
 81     for(i=0,k=0;i<n;i++) if(s[i]==p) 
 82         for(k=max(k,i-K);k<=min(n,i+K);k++) a[k].x=1;
 83     for(i=n-1,k=n-1;i;i--) if(s[i]==p) 
 84         for(k=min(k,i+K);k>=max(0,i-K);k--) a[k].x=1;
 85     for(i=0;i<m;i++) if(t[i]==p) b[m-i-1].x=1,num++;
 86     FFT::Main(len,L);
 87     for(i=0;i<n;i++) if((int)(c[i].x+0.1)<num) nt[i]=1;
 88 }
 89 
 90 int main()
 91 {
 92     int i,j,ans=0; 
 93     scanf("%d%d%d",&n,&m,&K);
 94     scanf("%s",S); scanf("%s",T);
 95     for(i=0;i<n;i++) s[i]=idx(S[i]);
 96     for(i=0;i<m;i++) t[i]=idx(T[i]);
 97     for(len=1,L=0;len<(n+m-1);len<<=1,L++);
 98     solve(0);
 99     solve(1);
100     solve(2);
101     solve(3);
102     for(i=0;i<n;i++) if(!nt[i]) ans++;
103     printf("%d\n",ans);
104     return 0;
105 
106 }  

 

转载于:https://www.cnblogs.com/guapisolo/p/10353778.html

相关文章:

  • c++随机数引擎
  • 《学习之道》第六章番茄工作法
  • 加密_滴答~滴
  • Ext中 grid 设置行样式
  • 技术研究 | 我所了解的物联网设备渗透手段(硬件篇)
  • Exif xss
  • C语言复习1_变量与数据类型
  • linux操作文本三个命令awk、grep、sed
  • 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
  • 食用指南
  • ffmpeg 推送、保存rtmp 流命令
  • 记账软件——第三天
  • 通过域对象获取当前项目的文件路径
  • VBA中Option的四种用法
  • Mybatis获取Connection
  • [deviceone开发]-do_Webview的基本示例
  • Angularjs之国际化
  • Docker容器管理
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 分布式熔断降级平台aegis
  • 服务器之间,相同帐号,实现免密钥登录
  • 计算机常识 - 收藏集 - 掘金
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单基于spring的redis配置(单机和集群模式)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 蓝海存储开关机注意事项总结
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 数组的操作
  • 微信支付JSAPI,实测!终极方案
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 源码安装memcached和php memcache扩展
  • 7行Python代码的人脸识别
  • ​水经微图Web1.5.0版即将上线
  • #{}和${}的区别是什么 -- java面试
  • (7)STL算法之交换赋值
  • (JS基础)String 类型
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (备忘)Java Map 遍历
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十三)Flask之特殊装饰器详解
  • (一)插入排序
  • (转)关于多人操作数据的处理策略
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .jks文件(JAVA KeyStore)