比赛 20160421s 评测结果 AWWTTTTTTT
题目名称 病毒编码 最终得分 10
用户昵称 mikumikumi 运行时间 7.009 s
代码语言 C++ 内存使用 1.55 MiB
提交时间 2016-04-21 10:16:46
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int SIZEN=100010,INF=0x7fffffff/2;
typedef long long LL;
int N,M;
int date[SIZEN];
int test[SIZEN];
int flag[SIZEN];
char str[SIZEN];
void read()
{
	scanf("%d%d",&M,&N);
	scanf("%s",str);
	for(int i=0;i<N;i++) date[i]=str[i]-'0';
	scanf("%s",str);
	for(int i=0;i<N;i++) test[i]=str[i]-'0';
}
LL ans=1e12;
int POW[20];
int Calc()
{
	int x1=flag[1],x2=flag[2];
	int C=0;
	int ans=0;
	for(int i=M,j=0;i>=3;i--,j++) C=flag[i]*POW[j];
	for(int i=0;i<N;i++) 
	{
		if(test[i]!=date[((i+(x2*2-1)*C)%N+N)%N]^x1) ans++;
	}
	return ans;
}
void dfs(int x,LL cnt)
{
	if(cnt>ans) return;
	if(x>M)
	{
		LL now=Calc();
		ans=min(now+cnt,ans);
		return;
	}
	flag[x]=0;
	dfs(x+1,cnt);
	flag[x]=1;
	dfs(x+1,cnt+1);
}
void work()
{
	POW[0]=1;
	for(int i=1;i<=M;i++) POW[i]=2*POW[i-1];
	dfs(1,0);
	printf("%d\n",ans);
}
int main()
{
	freopen("virusb.in","r",stdin);
	freopen("virusb.out","w",stdout);
	read();
	work();
	return 0;
}