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 ...
随机推荐
- WPF 基础到企业应用系列1——开篇故意
參考资料 提到參考资料,大家第一感觉就是MSDN,当然我也不例外.这个站点基本上是学习微软技术的首选站点,除了这个站点以外,我还參考了非常多其它的社区和站点,基本上都在.NET 技术社区之我见(英文篇 ...
- 找回Xcode7的代码折叠功能
升级到Xcode7后,会发现代码折叠功能不见了,这是怎么回事? 其实这个功能还在的,用以下的快捷键仍然可以折叠代码.只是不能用鼠标实现折叠了:在Xcode菜单里选择Preference——Text E ...
- Fakeapp2.2安装,使用简记
1,硬件和操作系统,支持cuda的Nvidia显卡,8G及以上的内存,Windows10 x64(推荐,Windows7 x64亲测可行),可以使用gpu-z查看你的显卡详情 我的笔记本是双显卡(都是 ...
- C#注冊表操作汇总
一.注冊表基本知识 1) 结构 键->项->子项->值项(名称.类型.数据) REG_SZ 字符串 REG_BINARY 二进制 REG_DWORD ...
- 【BZOJ4407】于神之怒加强版 莫比乌斯反演
[BZOJ4407]于神之怒加强版 Description 给下N,M,K.求 Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行, ...
- 新版的Spring4X怎样下载
点击下载 <a href="http://download.csdn.net/detail/zhaoqingkaitt/7733719">点击免费下载</a> ...
- spring定时器的配置
首先,新建一个java项目,下面导入需要的jar包: 这里有你需要的jar包哦. jar包下载 在src文件夹下,新建一个applicationContext.xml文件 <?xml versi ...
- [IR课程笔记]向量空间模型(Vector Space Model)
VSM思想 把文档表示成R|v|上的向量,从而可以计算文档与文档之间的相似度(根据欧氏距离或者余弦夹角) 那么,如何将文档将文档表示为向量呢? 首先,需要选取基向量/dimensions,基向量须是线 ...
- The PageFactory
The PageFactory 原文地址:https://github.com/SeleniumHQ/selenium/wiki/PageFactory In order to support the ...
- guava cache与spring集成
缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间.在cpu进行计算的时候, 首先是读取寄存器,然后内存,再是硬盘.由 ...