URAL 1996 Cipher Message 3
神题。
记得当初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的更多相关文章
- URAL 1996 Cipher Message 3 (FFT + KMP)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意 :给出两个串A , B,每个串是若干个byt ...
- Ural 1996 Cipher Message 3 (生成函数+FFT)
题面传送门 题目大意:给你两个$01$串$a$和$b$,每$8$个字符为$1$组,每组的最后一个字符可以在$01$之间转换,求$b$成为$a$的一个子串所需的最少转换次数,以及此时是从哪开始匹配的. ...
- URAL 1996. Cipher Message 3(KMP+fft)
传送门 解题思路 因为要完全匹配,所以前七位必须保证相同,那么就可以把前7位提出来做一遍\(kmp\)匹配,最后的答案一定在这些位置里.考虑最后一位,可以把最后一位单独取出来,要计算的是最后一位相同的 ...
- URAL 1654 Cipher Message 解题报告
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1654 题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保 ...
- ural Cipher Message
Cipher Message Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Desc ...
- URAL1996 Cipher Message 3(KMP + FFT)
题目 Source http://acm.timus.ru/problem.aspx?space=1&num=1996 Description Emperor Palpatine has be ...
- Gym 100285G Cipher Message 3
题意 给\(N,M(N,M \le 250000)\)的两个由8位二进制表示的两个序列,允许改变每个数字的第8位的数值(即0→1,1→0),求改变最少次数使得长为\(M\)的序列为长为\(N\)的连续 ...
- Cipher Message
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34121#problem/C // File Name: c.cpp // Author: ...
- URAL1966 Cipher Message 3
题目描述 题解: 能看出来的是,每一组数只能改最后一位,所以前$7$位动不了. 所以$KMP$跑一跑. 重点在于最后一位怎么搞. 如果$KMP$跑完了还没找到合适的位置,直接$puts("N ...
随机推荐
- sass的使用(载)
一.什么是SASSSASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般使 ...
- <LeetCode OJ> 337. House Robber III
Total Accepted: 1341 Total Submissions: 3744 Difficulty: Medium The thief has found himself a new pl ...
- 【每日Scrum】第六天(4.27) TD学生助手Sprint2站立会议
站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天和楠哥做了课程事件和日历表操作的例子,并尝试做时间表和日历表的数据库设计 Y 刘静 今天开始编辑自己项目中的日历管理 编辑程序,能够在日历 ...
- paxos算法之粗浅理解
paxos出身 paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport. paxos为何而生 那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而 ...
- 成长为 iOS 大 V 的秘密
成长为 iOS 大 V 的秘密 前言 毫不谦虚地说,我是国内 iOS 开发的大 V.我从 2011 年底开始自学 iOS 开发,经过 3 年时间,到 2014 年底,我不但写作了上百篇 iOS 相 ...
- ffmpeg编码常见问题排查方法
播放问题排查: 一旦我们遇到视频播放不了,第一件事,就是要找几个别的播放器也播放看看,做一下对比测试,或者对码流做一些基础分析,以便更好的定位问题的源头,而各个平台比较常见的播放/分析工具有如下几个: ...
- SICP 习题 (1.38)解题总结
SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式 ...
- 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 ...
- 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 ...
- java之插入排序
//插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始有序表只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个 ...