比赛 |
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;
}