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

2023-11-08

题目大意

官方

题解

这题给定的 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);
    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • vite pwa项目使用

    pwa介绍 PWA Progressive Web App 就是一种网页应用 可以离线使用 变成独立应用安装到系统中 渐进式网页应用 是一种基于网页的应用 但它和传统的Web App有些不同 以下是不同点 离线 轻量 离线可用 跟普通的网页
  • java中的跳转_Java中程序跳转关键字详解

    Java中的goto是保留字 目前不能使用 虽然没有goto语句可以增强程序的安全性 但是也带来很多不便 比如说 我想在某个循环知道到某一步的时候就结束 现在就做不了这件事情 为了弥补这个缺陷 Java就提供了break continue和
  • java.lang.NoClassDefFoundError: Could not initialize class xxx 原因及解决方法

    NoClassDefFoundError产生的原因有好几种 这里记录静态变量或静态块引起的 具体抛出的异常类似 java lang NoClassDefFoundError Could not initialize class xxx JV
  • 将C++数字类型转换成字符串

    include
  • SpringBoot2.x 集成 AntiSamy 防御XSS攻击

    AntiSamy是OWASP的一个开源项目 通过对用户输入的HTML CSS JavaScript等内容进行检验和清理 确保输入符合应用规范 AntiSamy被广泛应用于Web服务对存储型和反射型XSS的防御中 XSS攻击全称为跨站脚本攻击
  • SourceTree如何修改账号密码

    修改SourceTree账号或密码 修改账号 找到 C Users Administrator AppData Local Atlassian SourceTree 中的 userhosts 文件 删除其中要修改的账户 返回SourceTr
  • MySQL WHERE语句筛选操作符

    使用SELECT语句但不使用WHERE子句在表中查询数据 则会获取表中的所有行记录 这些行记录中大部分是不想要的行记录 WHERE子句允许根据指定的过滤表达式或条件来指定要选择的行 1 等于 等于 几乎任何数据类型都可以使用它 2 lt g
  • 小程序坑录-wx.getLocation接口申请

    最近在用uni app通用框架做h5和小程序 结果在小程序审核的时候 又遇到了很多天坑 故记录之 从2022 年 7 月 14 日开始 使用位置接口 就必须在app json中进行声明了 除此之外 在正式使用时 还需要在开发管理 接口权限内
  • 期货开户关于基本面量化

    一 库存 供求矛盾看库存 东西没有了 缺了 就会涨价 不缺 一般不会涨 所以 一定要注意库存 去库存快的品种 特别是库存低 价格低的品种 要重点关注 库存有一点要特别注意 要是 有效去库存 通过降价让下游买货 这种 去库存 不是根本 因为库
  • Leetcode:链表刷题(7道经典题目)

    Leetcode 链表刷题 7道经典题目 本文带来的是以链表为主题的一些经典题目 203 移除链表元素 707 设计链表 206 反转链表 24 两两交换链表中的节点 19 删除链表的倒数第 N 个结点 面试题 02 07 链表相交 142
  • Redis设置失效时间

    Redis设置失效时间还有nx和nxx 通过设置失效时间 可以将到达规定时间对应的key和value进行删除 设置失效时间的两种方式 1 在设值的时候设置失效时间 set code test ex px 秒 毫秒 时间 数值 set cod
  • 深度学习 FairMOT多目标跟踪(PANDA)

    FairMOT 复赛期间对于多目标跟踪任务使用的baseline 本质属于联合学习检测和嵌入模型 Joint Detection and Embedding JDE 毕设项目演示地址 链接 毕业项目设计代做项目方向涵盖 目标检测 语义分割
  • 关于航模的几点积累(四)关于螺旋桨

    关于固定翼飞行器的螺旋桨 1 螺旋桨的几种类型 按材质 塑料 木质 碳纤维 玻璃纤维 尼龙等 按桨叶数量 单叶桨 双叶桨 三叶桨等 按固定方式 快拆桨 大孔桨 适配子弹头 小孔桨 适配螺旋桨保护器 这几种螺旋桨之间的对比分析 2 螺旋桨的重
  • 计算机软件工程操作系统期末复习题

    1 计算机操作系统的功能是 D A 把源程序代码转换为目标代码 B 实现计算机用户之间的相互交流 C 完成计算机硬件与软件之间的转换 D 控制 管理计算机系统的资源和程序的执行 在现代计算机系统中 用户用高级语言编写的源程序必须通过编译程序
  • Elasticsearch Head的使用

    目录 概述 一 安装 Elasticsearch Head 二 解压文件 三 安装Elasticsearch Head依赖 四 启动 Elasticsearch Head 五 修改Elasticsearch Head启动端口号 六 使用 E
  • STM32的PWM控制4个舵机

    本人虽然接触STM32快半年了 但是最近才开始系统的学习STM32 建议一边学 一边做东西 能够更快的提升自己 我用的定时器是TIM3 所以我会把我出现的问题 分享给大家 希望大佬多多指教 因为我先进行部分映射 但是控制某个舵机的PB4引脚
  • 【SVN内网穿透】远程访问Linux SVN服务

    文章目录 前言 1 Ubuntu安装SVN服务 2 修改配置文件 2 1 修改svnserve conf文件 2 2 修改passwd文件 2 3 修改authz文件 3 启动svn服务 4 内网穿透 4 1 安装cpolar内网穿透 4
  • 【微信公众号对接】有关签名一直报错,提示invalid signature问题(我的签名和使用微信开发者工具验证返回的签名的是一致的)但还是报错!!!

    今天对接公众号 一直提示我签名有问题 但是我的签名和官方生成的签名一致 下面是对应数据比对 我的签名 微信官方提供签名 经过比对 两者是一致的 但是 就是一直提示错误 后面是解决思路 1 首先是需要在公众号管理平台配置对应服务器信息 包含白
  • 软件测试大作业 题目 网站测试,[软件分析与测试大作业] 测试性分析软件

    软件分析与测试 考试大作业 1 假设某单位内部电话号码由三部分组成 分别是 分机号 前缀 后缀 其中 分机号为空白或一位数字 前缀为非 0 开头的二位数字 后缀为非全0的3位数字 假定被测程序能接受一切符合上述规定的电话号码 拒绝所有不符合
  • 2023牛客暑期多校训练营7 I-We Love Strings (分块)

    文章目录 题目大意 题解 参考代码 题目大意 题解 这题给定的 n n n 大小和 s i s i si 的总长度有玄机