zoukankan      html  css  js  c++  java
  • jzoj 4616. 【NOI2016模拟7.12】二进制的世界

    Question

    在这里插入图片描述

    Solution

    这题考场就打了个暴力。
    结果有人O(216n)O(2^{16}*n)过了。。。
    正解是“折半”,O(28n)O(2^8*n)
    我们设f[i][j]f[i][j]
    有两个数x,yx,y
    x=a256+bx=a*256+b
    y=c256+dy=c*256+d
    (此处的ii就表示a,jj就表示dd
    f[i][j]f[i][j]就表示这样情况下的后八位操作后的最大值,
    g[i][j]g[i][j]表示其方案数。

    加入操作:

    我们设当前加入的数为xxx=a256+bx=a*256+b
    我们枚举一个dd(就是上述的dd
    我们将所有的f[a][d]f[a][d]bb optopt ddmaxmax

    查询操作:

    我们设要查询的数为xxx=a256+bx=a*256+b
    我们枚举一个cc(就是上述的cc
    我们对于一个f[c][b]f[c][b],前八位直接用aa optopt cc得到,后八位则是用f[c][b]f[c][b]来得到的。
    也就是说,我们设k=(ak=(a optopt c)256+f[c][b]c)*256+f[c][b],然后将kk与答案ansans进行比较即可。

    Code

    #include<cstdio>
    #define N 100010
    using namespace std;
    int n,type,a[N],le,ri,s1,s2;
    int ma[261][261],hav[261][261];
    char s[5];
    
    inline int read()
    {
    	int x=0; char c=getchar();
    	while (c<'0' || c>'9') c=getchar();
    	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	return x;
    }
    
    inline int get(int x,int y)
    {
    	if (s[1]=='a') return x&y;
    	if (s[1]=='o') return x|y;
    	if (s[1]=='x') return x^y;
    }
    
    int main()
    {
    	freopen("binary.in","r",stdin);
    	freopen("binary.out","w",stdout);
    	n=read(),scanf("%s",s+1),type=read();
    	for (int i=1;i<=n;i++) a[i]=read();
    	for (int i=1,k;i<=n;i++)
    	{
    		le=a[i]/256,ri=a[i]%256;
    		if (i!=1)
    		{
    			s1=s2=0;
    			for (int j=0;j<=255;j++)
    			{
    				if (!hav[j][ri]) continue;
    				k=get(le,j)*256+ma[j][ri];
    				if (s1<k) s1=k,s2=hav[j][ri];
    				else if (s1==k) s2+=hav[j][ri];
    			}
    			if (type==1) printf("%d %d
    ",s1,s2);
    			else printf("%d
    ",s1);
    		}
    		for (int j=0;j<=255;j++)
    		{
    			k=get(ri,j);
    			if (ma[le][j]==k) hav[le][j]++;
    			else if (ma[le][j]<k) ma[le][j]=k,hav[le][j]=1;
    		}
    	}
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    编程之类 字符串包括问题
    Performance Counter的使用
    MVVM Light Toolkit使用指南
    Lambda表达式详解
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
    在WPF中如何使用RelativeSource绑定
    WPF中使用ObjectDataProvider绑定方法
    免费的精品: Productivity Power Tools 动画演示
    使用Myeclipse进行简单webservice开发的示例
    <context:component-scan>使用说明
  • 原文地址:https://www.cnblogs.com/jz929/p/11817524.html
Copyright © 2011-2022 走看看