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

  1. #include<cstdio>
  2. #include<bitset>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define rep(i,l,r) for (int i=l; i<=r; i++)
  6. using namespace std;
  7.  
  8. const int N=,inf=0x3f3f3f3f;
  9. bitset<N>data,test;
  10. int n,m,ans,cost[N],cnt[];
  11. char s[N];
  12.  
  13. int main(){
  14. freopen("virus.in","r",stdin);
  15. freopen("virus.out","w",stdout);
  16. scanf("%d%d",&m,&n); int t=(<<m)-; ans=inf;
  17. memset(cost,0x3f,sizeof(cost)); cost[]=;
  18. rep(i,,t){
  19. cnt[i]=cnt[i>>]+(i&);
  20. cost[i%n]=min(cost[i%n],cnt[i]+);
  21. cost[((n-i)%n+n)%n]=min(cost[((n-i)%n+n)%n],cnt[i]);
  22. }
  23. scanf("%s",s); rep(i,,n) data[i]=s[i]=='';
  24. scanf("%s",s); rep(i,,n) test[i]=s[i]=='';
  25. for (int i=; i<n; i++){
  26. if (i) { int j=data[]; data>>=; data[n-]=j; }
  27. int j=(data^test).count();
  28. ans=min(ans,min(j,n-j+)+cost[i]);
  29. }
  30. printf("%d\n",ans);
  31. return ;
  32. }

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

观察异或真值表:

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,就变成上面的那个表了,这就成功将循环异或变成了循环卷积,直接做即可。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<complex>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define rep(i,l,r) for (int i=l; i<=r; i++)
  7. using namespace std;
  8. typedef complex<double> C;
  9. const int N=,inf=0x3f3f3f3f;
  10. const double pi=acos(-.);
  11. char s[N];
  12. int n,m,k,ans,cost[N],rev[N],cnt[],data[N],test[N],c[N];
  13.  
  14. C a[N],b[N];
  15.  
  16. void DFT(C a[],int n,int f){
  17. for (int i=; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
  18. for (int i=; i<n; i<<=){
  19. C wn=C(cos(pi/i),f*sin(pi/i));
  20. for (int p=i<<,j=; j<n; j+=p){
  21. C w=C(,);
  22. for (int k=; k<i; k++,w=w*wn){
  23. C x=a[j+k],y=a[i+j+k]*w; a[j+k]=x+y; a[i+j+k]=x-y;
  24. }
  25. }
  26. }
  27. if (f==-) for (int i=; i<n; i++) a[i].real()/=n;
  28. }
  29.  
  30. void mul(int test[],int data[],int res[],int m){
  31. int n,L=;
  32. for (n=; n<=m; n<<=) L++;
  33. for (int i=; i<n; i++) rev[i]=(rev[i>>]>>)|((i&)<<(L-));
  34. for (int i=; i<n; i++) a[i]=C((double)test[i],),b[i]=C((double)data[i],);
  35. DFT(a,n,); DFT(b,n,); for (int i=; i<n; i++) a[i]=a[i]*b[i]; DFT(a,n,-);
  36. m/=; for (int i=; i<m; i++) res[i]=int(a[i+m-].real()+0.5);
  37. }
  38.  
  39. int main(){
  40. freopen("virus.in","r",stdin);
  41. freopen("virus.out","w",stdout);
  42. scanf("%d%d",&m,&n); int t=(<<m)-; ans=inf;
  43. memset(cost,0x3f,sizeof(cost)); cost[]=;
  44. rep(i,,t){
  45. cnt[i]=cnt[i>>]+(i&);
  46. cost[i%n]=min(cost[i%n],cnt[i]+);
  47. cost[((n-i)%n+n)%n]=min(cost[((n-i)%n+n)%n],cnt[i]);
  48. }
  49. scanf("%s",s); for (int i=; i<n; i++) data[i]=data[i+n]=((s[i]=='')?:-);
  50. scanf("%s",s); for (int i=; i<n; i++) test[n-i-]=((s[i]=='')?:-);
  51. mul(test,data,c,*n);
  52. for (int i=; i<n; i++) k=(c[i]+n)>>,ans=min(ans,cost[i]+min(k+,n-k));
  53. printf("%d\n",ans);
  54. return ;
  55. }

[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. javascript 变量类型判断

    一.typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 "); typeof arr ...

  2. 制作Solaris系统的USB启动盘

    制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar  ...

  3. Linux简介——(一)

    1. 常见操作系统 - 服务端操作系统 : linux.unix.windows server - 单机操作系统 : windows(dos .ucdos.win95.win98.win2000.xp ...

  4. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  5. LINUX-内核-中断分析-中断向量表(3)-arm【转】

    转自:http://blog.csdn.net/haolianglh/article/details/51986987 arm中断概念 在<ARM体系结构与编程>第9章中说到,ARM 中有 ...

  6. 安全测试===appscan扫描工具介绍

    IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评估工作 ...

  7. 判断cookie创建的时间是否已经24小时

    def read_cookie(self): cookiesfilepath="cookies%s" % self.uid if os.path.exists(cookiesfil ...

  8. swiper 滑动插件,小屏单个显示滑动,大屏全部显示

    var currSwiperIndex=0; function widthHandle(){ var level = widthLevel(); if(level==1){ //单个显示,滑动 if( ...

  9. Leetcode 之Length of Last Word(38)

    做法很巧妙.分成左右两个对应的部分,遇到左半部分则入栈,遇到右半部分则判断对应的左半部分是否在栈顶.注意最后要判断堆栈是否为空. bool isValid(const string& s) { ...

  10. Hive分组取第一条记录

    需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...