2023牛客暑期多校训练营7 I-We Love Strings (分块)

文章目录

  • 题目大意
  • 题解
  • 参考代码

题目大意

官方

题解

这题给定的 n n n 大小和 s i s_i si 的总长度有玄机。
我们发现: 400 = 2 0 2 400=20^2 400=202,对于每一组数据 n n n 的个数每增加一个, s i s_i si 的平均值就会减小。
处理相同的 l l l s i s_i si
①:对于 s i ≤ 20 s_i\leq20 si20 ,完全可以暴力,枚举所有的边,复杂度为 l ∗ 2 s i l*2^{s_i} l2si
20 20 20 的范围内 最多有 20 ∗ ( s i z = 20 ) 20*(siz=20) 20siz=20) 条边 , 2 20 ∗ 20 2^{20}*20 22020 千万级别的计算。
②:对于 s i > 20 s_i>20 si>20 n < 20 n<20 n<20,考虑答案的唯一性,
如果两条边相同,则他们的贡献只有 1 1 1 ,容易得出如果某一位发生 0 0 0 1 1 1 冲突了,
他们就不是同一条边 ,如果某一位全是“ ? ? ? ”则答案的贡献 ∗ 2 *2 2
单独对于一条边,它的贡献就是 2 s u m i 2^{sum_i} 2sumi (sum为当前的问号个数)
由此我们发现了每两条边的匹配关系。总答案需要将他们去除。
a n s = a n s 1 − a n s 2 ans=ans_1-ans_2 ans=ans1ans2
显然的,这并不是最终答案,有一些边的贡献减了许多次。
这时候我们知道需要用容斥来计算结果了。
所以最终答案为 a n s = a n s 1 − a n s 2 + a n s 3 − . . . . . . ans=ans_1-ans_2+ans_3-...... ans=ans1ans2+ans3......
它的复杂度为枚举每一条边是否存在 s i ∗ 2 l s_i*2^l si2l
观察复杂度得到:
对于不同大小的 s i s_i si,我们进行分类讨论,用合适的算法计算。

参考代码

#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int mod=998244353;
int n;
string s[405];
char c[500],s1[500];
map<string,int> mp;
ll ans;
int cmp(string a,string b)
{
    return a.size()<b.size();
}
void dfs(int id,int x,int len,char c[500])
{
    if(x==len)                  //枚举
    {
        if(!mp[c])
            mp[c]=1,ans++;
    }
    ll a=0;
    if(s[id][x]=='?')
    {
        c[x]='1';
        dfs(id,x+1,len,c);
        c[x]='0';
        dfs(id,x+1,len,c);
    }
    if(s[id][x]=='1')
    {
        c[x]='1';
        dfs(id,x+1,len,c);
    }
    if(s[id][x]=='0')
    {
        c[x]='0';
        dfs(id,x+1,len,c);
    }
}
void work(char s1[500],int siz)           //重复的个数
{
    ll sum=1;
    int sum1=0;
    for(int i=0;i<siz;i++)
    {
        int tot=2;
        for(int j=1;j<=n;j++)
        {
            if(s1[j]=='1')
            {
                if(i==0)
                    sum1++;
            }
            else
                continue;
            int a=s[j][i]=='?'?2:s[j][i]-'0';
            if(tot==2)
                tot=a;
            else
            {
            	if(a==2)
            		tot=tot;
            	else if(tot==1 && a==0)
            		sum=0;
            	else if(tot==0 && a==1)
            		sum=0;
            	else
            		tot=a;
			}
        }
        if(tot==2){
        	sum=sum*2%mod;
		}
    }
    if(sum1==0)
        return;
//    cout<<s1<<" "<<sum<<endl;
    if(sum1&1)                 //容斥
        ans+=sum;
    else
        ans-=sum;
    ans%=mod;
    ans=(ans+mod)%mod;
}
void dfs1(int x,int len,char s1[500],int siz)
{
    if(x==len+1)
    {
//    	cout<<s1<<" "<<siz<<endl;
    	work(s1,siz);       //填数字1/0表示是否存在
    	return;
	}
    s1[x]='0';
    dfs1(x+1,len,s1,siz);
    s1[x]='1';
    dfs1(x+1,len,s1,siz);
    s1[x]='0';
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>s[i];
    sort(s+1,s+n+1,cmp);
    int r=0,l=1;
    for(int i=0;i<=3;i++)
        s1[i]='0';
    for(int i=1;i<=400;i++)
    {
        while(r+1<=n && s[r+1].size()==i)     //找出长度
            r++;
        if(l>r)
        	continue;
//        cout<<l<<" "<<r<<endl;
 		if(i<=20)                 //分块
             for(int j=l;j<=r;j++)
 	           dfs(j,0,i,c);
 	    else
	        dfs1(l,r,s1,i);
        l=r+1;	 
    }
    printf("%lld\n",ans%mod);
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/66394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx 负载均衡

1.环境准备 我使用的说centos7的系统 1.20版本的nginx 另外还有3台虚拟机 主机&#xff1a;192.168.163.142 两台服务器&#xff1a;服务器A--192.168.163.140 服务器B---192.168.163.141 2.配置服务器A和B 找到nginx下的html目录&#xff0c;编辑其中的index.html(在此…

前端懒加载

懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分…

【Vue+Element-plus】记录后台首页多echart图静态页面

一、页面效果 二、完整代码 Index.vue <template><div><div><DateTime /><!-- {{username}} --></div><el-row :gutter"20"><el-col :span"8"><div class"grid-content bg-purple"><P…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…

Unity之ShaderGraph 节点介绍 Procedural节点

程序化 噪声Gradient Noise&#xff08;渐变或柏林噪声&#xff09;Simple Noise&#xff08;简单噪声&#xff09;Voronoi&#xff08;Voronoi 噪声&#xff09; 形状Ellipse&#xff08;椭圆形&#xff09;Polygon&#xff08;正多边形&#xff09;Rectangle&#xff08;矩形…

一位年薪40W的测试被开除,回怼的一番话,令人沉思

一位年薪40W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…

Flutter:文件读取—— video_player、chewie、image_picker、file_picker

前言 简单学习一下几个比较好用的文件读取库 video_player 简介 用于视频播放 官方文档 https://pub-web.flutter-io.cn/packages/video_player 安装 flutter pub add video_player加载网络视频 class _MyHomePageState extends State<MyHomePage> {// 控制器late…

瑞数系列及顶像二次验证LOGS

瑞数商标局药监局专利局及顶像二次验证 日期&#xff1a;20230808 瑞数信息安全是一个专注于信息安全领域的公司&#xff0c;致力于为企业和个人提供全面的信息安全解决方案。他们的主要业务包括网络安全、数据安全、应用安全、云安全等方面的服务和产品。瑞数信息安全拥有一支…

测试经理应该怎么写测试部门年终总结报告?

年终总结一般对季度、半年度或年度总结的一个整理&#xff0c;我们需要定期对工作中的内容进行定期总结和复盘。将每一次复盘中总结出来的一些收获叠加起来&#xff0c;在针对性地调整一下&#xff0c;就是一份合格的年终总结。具体可以分为如下几个步骤&#xff1a; 1.先把这…

《Zookeeper》源码分析(五)之 ServerCnxnFactory的工作原理(上)

目录 AcceptThread数据结构构造函数run() SelectorThread数据结构processAcceptedConnections()select()processInterestOpsUpdateRequests() 本文开始分析 ServerCnxnFactory的工作原理&#xff0c;按照顺序我们这样分析&#xff1a; 建立连接监听读写事件处理读写就绪的事件…

Jenkins+Docker+SpringCloud微服务持续集成

JenkinsDockerSpringCloud微服务持续集成 JenkinsDockerSpringCloud持续集成流程说明SpringCloud微服务源码概述本地运行微服务本地部署微服务 Docker安装和Dockerfile制作微服务镜像Harbor镜像仓库安装及使用在Harbor创建用户和项目上传镜像到Harbor从Harbor下载镜像 微服务持…

Java中ArrayList常用方法的学习

Java中ArrayList常用方法的学习 需求分析代码实现小结Time 需求分析 ArrayList集合的常用方法学习 代码实现 java.util.ArrayList;/*** Author:LQ* Description:* Date:Created in 16:45 2023/8/9*/ public class ListTest {public static void main(String[] args) {ArrayLis…

QT QLCDNumber 使用详解

本文详细的介绍了QLCDNumber控件的各种操作&#xff0c;例如&#xff1a;新建界面、源文件、设置显示位数、设置进制、设置外观、设置小数点、设置溢出、显示事件、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;手动调整它们的位置既费时…

【源码编译并安装RocketMQ Dashboard】

【源码编译并安装RocketMQ Dashboard】 一、环境说明二、源码编译并执行三、小结 一、环境说明 安装环境&#xff1a;虚拟机VMWare Centos7.6 Maven3.6.3 JDK1.8已经安装了RocketMQ-5.1.3 单Master集群&#xff0c;且使用Local模式部署&#xff0c;即Broker和Proxy同进程部署…

springcloud3 bus+springconfig 实现配置文件的动态刷新(了解)

一 springcloud Bus的作用 1.1 springcloud的作用 spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。 它整合了java的事件处理机制和消息中间件的功能。其中目前支持RabbitMQ和kafka 简介&#xff1a; bus实现多个服务的配置文件动态刷新。 1.2 …

Pytorch Tutorial【Chapter 3. Simple Neural Network】

Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …

网络基本概念

目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…

linux系统虚拟主机开启支持Swoole Loader扩展

特别说明&#xff1a;只是安装支持Swoole扩展&#xff0c;主机并没有安装服务端。目前支持版本php5.4-php7.2。 1、登陆主机控制面板&#xff0c;找到【远程文件下载】这个功能。 2、远程下载文件填写http://download.myhostadmin.net/vps/SwooleLoader_linux.zip 下载保存的路…

跳表与Redis

跳表原理 跳表是Redis有序集合ZSet底层的数据结构 首先有一个头结点 这个头结点里面的数据是null 就是他就是这个链表的最小值 就算是Math.Min也比它大 然后我们新建一个节点的时候是怎么操作的呢 先根据参数(假如说是5)创建一个节点 然后把它放在对应位置 就是找到小于他的最…

web安全漏洞

1.什么是Web漏洞 WEB漏洞通常是指网站程序上的漏洞&#xff0c;可能是由于代码编写者在编写代码时考虑不周全等原因而造成的漏洞。如果网站存在WEB漏洞并被黑客攻击者利用&#xff0c;攻击者可以轻易控制整个网站&#xff0c;并可进一步提前获取网站服务器权限&#xff0c;控制…