传送门

解题思路

  因为要完全匹配,所以前七位必须保证相同,那么就可以把前7位提出来做一遍\(kmp\)匹配,最后的答案一定在这些位置里。考虑最后一位,可以把最后一位单独取出来,要计算的是最后一位相同的个数,那么就可以做两次\(fft\)得到\(haming dis\)。先把\(b\)翻转,然后做一次,得到的是全为\(1\)的个数,再把\(a,b\)取反做一次,得到的是全为\(0\)的个数,然后扫一遍\(kmp\)后的匹配位置,取个最小值。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib> using namespace std;
const int MAXN = 1000005;
const double Pi = acos(-1); int a[MAXN],b[MAXN],pos[MAXN],p[MAXN],rev[MAXN],id,n,m;
int nxt[MAXN],cnt,limit=1,c[MAXN],d[MAXN],ans=1e9;
struct Complex{
double x,y;
Complex(double _x=0,double _y=0){x=_x;y=_y;}
}f[MAXN],g[MAXN]; Complex operator+(Complex A,Complex B){return Complex(A.x+B.x,A.y+B.y);}
Complex operator-(Complex A,Complex B){return Complex(A.x-B.x,A.y-B.y);}
Complex operator*(Complex A,Complex B){return Complex(A.x*B.x-A.y*B.y,A.x*B.y+A.y*B.x);} void fft(Complex *f,int type){
for(int i=0;i<limit;i++) if(i<rev[i]) swap(f[i],f[rev[i]]);
Complex Wn,w,tmp;int len;
for(int i=2;i<=limit;i<<=1){
len=i>>1;Wn=Complex(cos(Pi/len),type*sin(Pi/len));
for(int j=0;j<limit;j+=i){
w=Complex(1,0);
for(int k=j;k<j+len;k++){
tmp=w*f[k+len];f[k+len]=f[k]-tmp;
f[k]=f[k]+tmp;w=w*Wn;
}
}
}
} inline void get_nxt(){
for(int i=2,j=0;i<=m;i++){
while(j>0 && b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) j++;
nxt[i]=j;
}
} inline void get_match(){
for(int i=1,j=0;i<=n;i++){
while(j>0 && a[i]!=b[j+1]) j=nxt[j];
if(a[i]==b[j+1]) j++;
if(j==m) pos[++cnt]=i-m+1,j=nxt[j];
}
} inline void get_init(){
while(limit<=n+m) limit<<=1;
for(int i=0;i<limit;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?limit>>1:0);
} inline void get_ans(){
for(int i=0;i<n;i++) f[i].x=c[i],f[i].y=0;
for(int i=0;i<m;i++) g[i].x=d[i],g[i].y=0;
for(int i=n;i<limit;i++) f[i].x=f[i].y=0;
for(int i=m;i<limit;i++) g[i].x=g[i].y=0;
fft(f,1);fft(g,1);
for(int i=0;i<limit;i++) f[i]=f[i]*g[i];
fft(f,-1);
for(int i=0;i<=n-m;i++) p[i]+=(int)(f[i+m-1].x/limit+0.5);
} int main(){
scanf("%d%d",&n,&m);char s[10];
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=7;j++)
a[i]=(a[i]<<1)+(s[j]-'0');
c[i-1]=s[8]-'0';
}
for(int i=1;i<=m;i++){
scanf("%s",s+1);
for(int j=1;j<=7;j++)
b[i]=(b[i]<<1)+(s[j]-'0');
d[m-i]=s[8]-'0';
}
get_nxt();get_match();
if(!cnt) puts("No");
else{
puts("Yes");
get_init();get_ans();
for(int i=0;i<n;i++) c[i]^=1;
for(int i=0;i<m;i++) d[i]^=1;
get_ans();
for(int i=1;i<=cnt;i++)
if(m-p[pos[i]-1]<ans) {
ans=m-p[pos[i]-1];
id=pos[i];
}
printf("%d %d",ans,id);
}
return 0;
}

URAL 1996. Cipher Message 3(KMP+fft)的更多相关文章

  1. Ural 1996 Cipher Message 3 (生成函数+FFT)

    题面传送门 题目大意:给你两个$01$串$a$和$b$,每$8$个字符为$1$组,每组的最后一个字符可以在$01$之间转换,求$b$成为$a$的一个子串所需的最少转换次数,以及此时是从哪开始匹配的. ...

  2. URAL 1996 Cipher Message 3 (FFT + KMP)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意 :给出两个串A , B,每个串是若干个byt ...

  3. URAL 1996 Cipher Message 3

    题目 神题. 记得当初DYF和HZA讲过一个FFT+KMP的题目,一直觉得很神,从来没去做. 没有真正理解FFT的卷积. 首先考虑暴力. 只考虑前7位 KMP 找出所有 B 串可以匹配 A 串的位置. ...

  4. URAL 1654 Cipher Message 解题报告

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1654 题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保 ...

  5. ural Cipher Message

    Cipher Message Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Desc ...

  6. URAL1996 Cipher Message 3(KMP + FFT)

    题目 Source http://acm.timus.ru/problem.aspx?space=1&num=1996 Description Emperor Palpatine has be ...

  7. Gym 100285G Cipher Message 3

    题意 给\(N,M(N,M \le 250000)\)的两个由8位二进制表示的两个序列,允许改变每个数字的第8位的数值(即0→1,1→0),求改变最少次数使得长为\(M\)的序列为长为\(N\)的连续 ...

  8. hdu 4300 Clairewd’s message(扩展kmp)

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  9. hdu4300 Clairewd’s message 扩展KMP

    Clairewd is a member of FBI. After several years concealing in BUPT, she intercepted some important ...

随机推荐

  1. loadRunner函数之web_find

    int web_find( const char *StepName, <Attributes and Specifications list>, char *searchstring, ...

  2. Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析

    一.SELinux安全防护 目标: 本案例要求熟悉SELinux防护机制的开关及策略配置,完成以下任务: 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下, ...

  3. layui多图上传加隐藏域

    我的情况是,通过layui上传图片调用后端,后端将图片上传后返回图片路径,上传成功后将图片在页面显示出来(避免用户网速不稳定,图片其实还没上传成功就进行下一步操作),然后同步每个图片增加隐藏域,最终表 ...

  4. CDN技术之--流媒体CDN系统的组成

    流媒体业务是一种对实时性.连续性.时序性要求非常高的业务,无论从带宽消耗上还是质量保障上来说,对best-effort的IP网络都是一个不小的冲击 –高带宽要求–高QoS要求–组播.广播要求(目前IP ...

  5. window.open 打开新窗口被拦截的解决方案

    最近公司开发的一个项目,平凡用到下载各种类型的文件,但是例如.txt,.jpg,.pdf格式的文件呢浏览器会在当前窗口直接打开,影响用户体验,尝试各种方案和百度总结一下几点: 原理: 当window. ...

  6. bootstrap的模态框的使用

    bootstrap的模态框 如果只想单独使用模态框功能,可以单独引入modal.js,和bootstrap的css,在bootstrap的包中,可引入bootstrap.js. 用法 通过data属性 ...

  7. 【开源项目】一篇文章搞掂:Pig微服务框架

    1.项目开发环境和运行步骤 1.1.项目开发环境 Idea:2018.1.6 Maven:3.5.3 JDK:1.8.0_172 MySQL:5.7.19(之前安装8.0.11会运行失败) Redis ...

  8. 没有找到MSVCR110.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题

    问题: 在win7下用vs2012编译了一个exe放到xp上运行,弹出错误框"没有找到MSVCR110.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此问题" 解决办 ...

  9. cs224d 作业 problem set2 (三) 用RNNLM模型实现Language Model,来预测下一个单词的出现

      今天将的还是cs224d 的problem set2 的第三部分习题, 原来国外大学的系统难度真的如此之大,相比之下还是默默地再天朝继续搬砖吧 下面讲述一下RNN语言建模的数学公式: 给出一串连续 ...

  10. IIS发布获取apk文件,部署IIS遇到的问题记录

    今天需要帮着测试一下PDA的检测更新功能,所以需要把web部署到IIS上. 在部署的时候,遇到了两个小问题. 一.web 服务器被配置为不列出此目录的内容. 解决办法:1.按照提示的可尝试操作,启用了 ...