题目

神题。

记得当初DYF和HZA讲过一个FFT+KMP的题目,一直觉得很神,从来没去做。

没有真正理解FFT的卷积。

首先考虑暴力。

只考虑前7位 KMP 找出所有 B 串可以匹配 A 串的位置。

设 a(i) = A(i) & 1, b(i) = B(i) & 1

然后相当于求所有的

c(i) =  ∑k=0m-1 a(i+k) * b(k)

考虑卷积形式:

c(i) =  ∑k=0m-1 a(k) * b(i - k)

将b串反过来

c(i) = ∑k=0m-1  a(k) * b(m-i+k)

改变 c 的定义令原先的 C(i) = 现在的 c(i+m)

得到 C(i) = ∑k=0m-1  a(k) * b(k-i)

所以 C(i) = ∑k=0m  a(k) * b(i-k+n)

然后FFT解决。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <complex>
#include <cmath> #define N 250010
#define Ex complex<double>
#define pi 3.14159265354 using namespace std; int n,m,a[N],b[N],same[N],rev[N<<]; inline void scan(int &x){
char tmp[];
scanf("%s",tmp);
x=;
int len=strlen(tmp);
for(int i=len-;~i;i--)
if(tmp[i]=='') x|=(<<(len-i-));
} inline bool simple(int a,int b){
return (a|)==(b|);
} int f[N];
bool match[N];
Ex A[N<<],B[N<<],C[N<<]; void fft(Ex x[],int n,int t){
for(int i=;i<n;i++){
if(rev[i]>i) swap(x[rev[i]],x[i]);
}
for(int m=;m<n;m<<=){
Ex wn(cos(pi/m*t),sin(pi/m*t));
for(int k=;k<n;k+=(m<<)){
Ex wt(,);
for(int i=;i<m;i++,wt*=wn){
Ex &A=x[i+m+k],&B=x[i+k],tmp=wt*A;
A=B-tmp; B=B+tmp;
}
}
}
if(t==-){
for(int i=;i<n;i++)
x[i]/=(double)n;
}
} int main(){
freopen("message10.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) scan(a[i]);
for(int i=;i<m;i++) scan(b[i]);
f[]=f[]=;
for(int i=;i<m;i++){
int j=f[i];
while(j&&!simple(b[i],b[j])) j=f[j];
f[i+]= simple(b[i],b[j])? j+:;
}
int j=;
bool flag=;
for(int i=;i<n;i++){
while(j&&!simple(b[j],a[i])) j=f[j];
if(simple(b[j],a[i])) j++;
if(j==m) match[i-m+]=,flag=;
}
if(!flag){
puts("No");
return ;
}
puts("Yes");
int T=,nt;
for(nt=;nt<=(n+m);nt<<=) T++;
for(int i=;i<nt;i++) rev[i]=(rev[i>>]>>)|((i&)<<(T-));
for(int i=;i<n;i++) A[i]=a[i]&;
for(int i=;i<m;i++) B[i]=b[m-i-]&;
fft(A,nt,);
fft(B,nt,);
for(int i=;i<nt;i++) C[i]=A[i]*B[i];
fft(C,nt,-);
for(int i=;i<n;i++) same[i]+=(int)(C[i].real()+0.5);
for(int i=;i<nt;i++) A[i]=B[i]=C[i]=;
for(int i=;i<n;i++) A[i]=(a[i]&)^;
for(int i=;i<m;i++) B[i]=(b[m-i-]&)^;
fft(A,nt,);
fft(B,nt,);
for(int i=;i<nt;i++) C[i]=A[i]*B[i];
fft(C,nt,-);
for(int i=;i<n;i++) same[i]+=(int)(C[i].real()+0.5);
int ansv=0x3f3f3f3f,anst=;
for(int i=;i<n;i++){
if(!match[i]) continue;
if(m-same[i+m-]<ansv){
ansv=m-same[i+m-];
anst=i+;
}
}
printf("%d %d\n",ansv,anst);
return ;
}

URAL 1996 Cipher Message 3的更多相关文章

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

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

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

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

  3. URAL 1996. Cipher Message 3(KMP+fft)

    传送门 解题思路 因为要完全匹配,所以前七位必须保证相同,那么就可以把前7位提出来做一遍\(kmp\)匹配,最后的答案一定在这些位置里.考虑最后一位,可以把最后一位单独取出来,要计算的是最后一位相同的 ...

  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. Cipher Message

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34121#problem/C // File Name: c.cpp // Author: ...

  9. URAL1966 Cipher Message 3

    题目描述 题解: 能看出来的是,每一组数只能改最后一位,所以前$7$位动不了. 所以$KMP$跑一跑. 重点在于最后一位怎么搞. 如果$KMP$跑完了还没找到合适的位置,直接$puts("N ...

随机推荐

  1. sass的使用(载)

    一.什么是SASSSASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般使 ...

  2. &lt;LeetCode OJ&gt; 337. House Robber III

    Total Accepted: 1341 Total Submissions: 3744 Difficulty: Medium The thief has found himself a new pl ...

  3. 【每日Scrum】第六天(4.27) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天和楠哥做了课程事件和日历表操作的例子,并尝试做时间表和日历表的数据库设计 Y 刘静 今天开始编辑自己项目中的日历管理 编辑程序,能够在日历 ...

  4. paxos算法之粗浅理解

    paxos出身 paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport. paxos为何而生 那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而 ...

  5. 成长为 iOS 大 V 的秘密

    成长为 iOS 大 V 的秘密   前言 毫不谦虚地说,我是国内 iOS 开发的大 V.我从 2011 年底开始自学 iOS 开发,经过 3 年时间,到 2014 年底,我不但写作了上百篇 iOS 相 ...

  6. ffmpeg编码常见问题排查方法

    播放问题排查: 一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个: ...

  7. SICP 习题 (1.38)解题总结

    SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式 ...

  8. javascript JS递归遍历对象 使用for(variable in object)或者叫for/in和forEach方式

    1.递归遍历查找特定key值(ie9以下不支持forEach) 原文http://www.cnblogs.com/ae6623/p/5938560.html var obj = { first: &q ...

  9. Rethinking the Inception Architecture for Computer Vision

    https://arxiv.org/abs/1512.00567 Convolutional networks are at the core of most state-of-the-art com ...

  10. java之插入排序

    //插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始有序表只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个 ...