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 ...
随机推荐
- 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作
Chap3 文件操作 P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile sh的初始化脚本: .kshr ...
- Vb.net/VB 声明API函数实现父窗口功能
回想第一次敲机房收费.自己调用了api函数实现了父窗口及其子窗口最小化的功能.现在再次遇到,自己就在思考,能不能继续使用API函数呢?答案当然是Of Course! 事实上细致看两者并没有多大的差别. ...
- Day1[下] - Python基础1 基本语法、流程控制
一.变量\字符编码 Variables are used to store information to be referenced and manipulated in a computer pro ...
- Chrome 前端 插件
本文内容都来源于偶整理的fetool. 想让更多使用Chrome的小伙伴,体验到这些令人愉悦的小工具,所以单独整理了这篇文章. 如果你是 前端/服务端/设计/面向Github编程/视觉控,相信下列的插 ...
- 使用Caffe完成图像目标检测 和 caffe 全卷积网络
一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...
- wince c# 创建桌面快捷方式 .
static void Create() { string PathGPRS = System.IO.Path.GetDirectoryName(System.Reflection.Assembly. ...
- GCJ Qualification Round 2016 D题
这题就是找规律.小数据还是挺容易想的.大数据得再深入分析一下. 题意挺绕的. 其实就是字符串转换.字符串只能有两种字母,L或G.给定K和C,就能通过规则生成目标字符串. 那么,如果知道了K和C,以及目 ...
- Hadoop实战-使用Eclipse开发Hadoop API程序(四)
一.准备运行所需Jar包 1)avro-1.7.4.jar 2)commons-cli-1.2.jar 3)commons-codec-1.4.jar 4)commons-collections-3. ...
- intelliJ IDEA springMVC 搭建配置
1.添加参数 archetypeCatalog=internal
- 基于 phantomjs 的自动化测试---(1)
它主要靠js脚本来模拟操作一般流程是写代码写代码写代码open 某个 url监听 onload 事件事件完成后调用 sendEvent 之类的 api 去点击某个 DOM 元素所在 point触发交互 ...