首页 > 其他分享 >CF1995D-状态压缩

CF1995D-状态压缩

时间:2024-08-04 11:49:33浏览次数:12  
标签:状态 int 压缩 CF1995D 单词 大小写 集合 标识符 字母

CF1995D-状态压缩

大致题意

你是一名语言学家,正在研究一种神秘的古代语言。你知道

  1. 它的单词只由拉丁字母的前 c 个字母组成。
  2. 每个单词都有一个大小写,可以通过其最后一个字母明确地确定(不同的字母对应不同的大小写)。例如,单词 "ABACABA "和 "ABA"(如果存在的话)在该语言中具有相同的大小写,因为它们都有相同的词尾 "A",而 "ALICE "和 "BOB "则有不同的大小写。如果语言中没有与某个字母相对应的大小写,则表示该单词不能以该字母结尾。
  3. 每个单词的长度为 k 或更少。

您有一个用这种语言写成的文本。不幸的是,由于这种语言非常古老,单词之间没有空格,所有字母都是大写。您想知道这种语言的最少大小写个数是多少。您能找出答案吗?

说人话就是我们将字符串分成多个集合,每个集合的长度可以为\([1,k]\),我们将每个集合的最后一个字符作为标识符,分出的集合标识符总个数越少越好(相同标识符记为同一个)

解题思路

我们考虑对于一个长度为k的集合,其中至少有一个字符作为标识符那么该集合就为合法的集合,那么我们就可以这样考虑,只要我们枚举每一种分割集合的方法,将每个合法的集合算出来求每种方法分割可以得到的最少标识符个数就可以得到答案。

但是对于这种方法复杂度过高,所以我们反过来想去找非法的集合。

我们可以通过状态压缩枚举长度为k的子串中出现过的字符,我们将其命名为集合\(S\),该集合一定为合法集合,那么对于集合\(S\),其补集\(C_uS\)以及该补集的子集一定为非法集合,我们剔除所有的非法集合之后我们就能得到所有的合法集合(此时的合法集合和我们的集合\(S\)并不相同,其结果为每种分割方法所能得到的合法集合)

代码实现

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
void solve()
{
	int n,c,k;
	cin>>n>>c>>k;
	vector<int> s((1<<c)+1),pos(c+1,-1);
	string st;
	cin>>st;
	for(int i = 0;i < k-1;++i)
	{
		pos[st[i]-'A'] = i;
	}
	for(int i = k-1;i<n;++i)
	{
		pos[st[i]-'A'] = i;
		int l = i-k+1,r = i;
		int mask = 0;
		for(int j = 0;j < c;++j)
		{
			if(pos[j]>=l&&pos[j]<=r)
			{
				mask |= (1<<j);
			}
		}
		s[mask] = 1;
	}

	s[1<<(st[n-1]-'A')] = 1;
	vector<int> bad((1ll<<c)+1);
	for(int i = 0;i < (1ll<<c);++i)
	{
		bad[i^((1ll<<c)-1)] = s[i];
	}
	for(int i = (1ll<<c)-1;i>=0;--i)
	{
		if(bad[i])
		{
			for(int j = 0;j < c;++j)
			{
				if(i&(1ll<<j))
				{
					bad[i-(1ll<<j)] = 1;
				}
			}
		}
	} 
	int ans = c;
	for(int i = 1;i < (1ll<<c);++i)
	{
		if(!bad[i])
		{
			int res = 0;
			int t = i;
			while(t)
			{
				res += (t&1);
				t>>=1; 
			}
			ans = min(ans,res);
		}
	
	}
	cout<<ans<<endl;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int tt;
	cin>>tt;
	while(tt--)solve();
	return 0;
}

标签:状态,int,压缩,CF1995D,单词,大小写,集合,标识符,字母
From: https://www.cnblogs.com/empty-y/p/18341563

相关文章

  • 数据结构之特殊矩阵的压缩存储
    1.对称矩阵的压缩存储定义:若n阶矩阵A满足a(ij)=a(ji)(1≤i,j≤n),则称A为n阶对称矩阵。压缩存储方法:由于对称矩阵上三角和下三角的元素相同(主对角线上的元素只存储一次),因此可以只存储上三角(或下三角)的元素和主对角线上的元素。存储方式:通常使用一维数组来存储这些元素。......
  • 实用好软-----照片压缩软件推荐 拍摄的图片太大 如何无损缩小
                   随着您照片的增多,您是不是觉得电脑的硬盘都快不够用。数码照片压缩是将数码照片文件的大小减小,以便更方便地存储、分享或传输。压缩图像文件可以减少存储空间的需求,同时也可以减少上传或下载图像的时间。以下是几种常见的数码照......
  • 【C++BFS】802. 找到最终的安全状态
    本文涉及知识点C++BFS算法LeetCode802.找到最终的安全状态有一个有n个节点的有向图,节点按0到n-1编号。图由一个索引从0开始的2D整数数组graph表示,graph[i]是与节点i相邻的节点的整数数组,这意味着从节点i到graph[i]中的每个节点都有一条边。如果一......
  • 【Unity XR Input 获取Quest和Pico各个按键状态,按下、抬起、按下中】
    usingSystem;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.XR;usingQFramework;///<summary>///提供各种输入事件///</summary>publicclassInputEvent:MonoSingleton<InputEvent>{//*************输入设别***********......
  • SAP 生产订单状态简介
    SAP生产订单状态简介SAP生产订单状态的简介:生产订单状态取值在SAP中,生产订单的状态是关键的管理工具,用于跟踪和控制生产过程。每个生产订单都会经历一系列状态,这些状态提供了有关生产订单当前进展和完成情况的重要信息。SAP生产订单状态的简介:CRTD(创建)......
  • 【创新未发表】Matlab实现蚁狮优化算法ALO-Kmean-Transformer-LSTM组合状态识别算法研
    蚁狮优化算法(AntLionOptimisation,ALO)是一种启发式优化算法,灵感来源于蚁狮捕食过程中的行为。这种算法模拟了蚁狮捕食中的策略,其中蚁狮通过在环境中设置虚拟陷阱来吸引蚂蚁,然后捕食这些落入陷阱的蚂蚁。在算法中,蚁狮代表潜在解决方案,而虚拟陷阱代表目标函数的局部最小值。......
  • 区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(三)合约状态
    今天我们要讨论的是如何与智能合约进行交互,获取合约状态。下面的示例将会详细讲解如何与合约进行交互,及一些概念性的解释,有需要的朋友们可以收藏一下。一:概念解释在下面示例之前呢,我先解释下为什么需要调用合约状态,以及合约状态对开发而言有什么作用。实时的了解合约状......
  • 模型量化技术综述:揭示大型语言模型压缩的前沿技术
    大型语言模型(LLMs)通常因为体积过大而无法在消费级硬件上运行。这些模型可能包含数十亿个参数,通常需要配备大量显存的GPU来加速推理过程。因此越来越多的研究致力于通过改进训练、使用适配器等方法来缩小这些模型的体积。在这一领域中,一个主要的技术被称为量化。在这篇文章中,我......
  • 【Linux进程理解】| 冯诺依曼体系结构 | 操作系统 | 进程理解 | 状态 | 优先级
    本文目录【写在前面】一、冯•诺依曼体系结构......
  • Python 警告:重试(重试(总计=4,连接=无,读取=无,重定向=无,状态=无))
    我正在尝试pipinstall--upgradepip并保持收到此错误:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ProxyError('Cannotconnecttoproxy.',NewConnectionError('<......