题意看起来好麻烦实际上很简单,首先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. 【比赛】洛谷夏令营NOIP模拟赛

    Day1 第一题 水题 第二题 题意:一个n*m的字符矩阵从左上到右下,经过字符形成回文串的路径数.n≤500 回文串,考虑两段往中间DP. f[k][x][y]表示走了k步,左上点横坐标为x,右下点 ...

  2. 【51NOD-0】1006 最长公共子序列Lcs

    [算法]经典DP [题解]经典lcs,输出路径可以记录上一个有效节点就是有点麻烦. 因为开始时写法不太明确,打印结果时初始循环地方搞错了,后来修正写法时忘了改过来,调了好久. #include< ...

  3. 基本控件文档-UIButton属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  4. python碎片记录(一)

    1.python中求幂运算 2**31-1     2的31次方减一(32位整型数据范围为-2^31~2^31-1,最高位为符号位,负向值比正向值绝对值大1) 2.python中整数除法 x=x//1 ...

  5. 有向有权图的最短路径算法--Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  6. Python标准库笔记(4) — collections模块

    这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...

  7. mysql之安装和配置(一)

    环境 oracle linux7.3 数据库:MySQL-5.7.20 mysql的安装 先安装依赖的插件 yum install libaio 去官网下载mysql-5.7.20的tar.gz包: ...

  8. qt-creator

    https://github.com/qt-creator/qt-creator https://github.com/qt-creator

  9. python并发模块之concurrent.futures(一)

    Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threadin ...

  10. ES Java 客户端

    标签(空格分隔): ES Java 客户端 节点客户端(node client): 节点客户端本身也是一个ES节点(一般不保存数据,不能成为主节点),它能以无数据节点身份加入到集群中.因为它是集群环境 ...