首页 > 其他分享 >CF1234F Yet Another Substring Reverse

CF1234F Yet Another Substring Reverse

时间:2024-06-06 18:44:52浏览次数:26  
标签:子串 CF1234F int long Substring Yet define

CF1234F Yet Another Substring Reverse

状压 dp+高维前缀和

一个很显然的发现是最长子串长度不会超过字符集。那么如果没有这个操作,是很简单的,我们看看多了这个操作意味着什么。

对于一个子串,考虑一次翻转对它的影响。在它内部的翻转肯定是没有意义的;我们一定有一个操作能将任意子串与它接到一起,可以改变答案。那么我们就可以刻画这样一个翻转操作:将两个各个字符不相同的(不相交的)子串接在一起(因为发现各个字符不相同已经保证了两个子串不相交)。

考虑状压字符集,设 \(f_{s}\) 表示包含字符集 \(s\) 的子串是否存在,转移就枚举 \(s\) 补集的子集 \(f_{t}\),合并即可。

复杂度 \(O(3^n)\),考虑优化。发现瓶颈在于枚举补集的子集,而我们只需要其中的最大值,所欲可以 \(O(2^nn)\) 高维前缀和预处理每个集合的所有子集的最大值。

复杂度 \(O(2^nn)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 10, S = 21;
int n, ans;
int f[1 << S], g[1 << S];
char s[N];
void solve() {
	std::cin >> s + 1;

	n = strlen(s + 1);
	for(int i = 1; i <= n; i++) {
		int sta = 0;
		for(int j = 0; i + j <= n; j++) {
			int c = s[i + j] - 'a';
			if((1 << c) & sta) break;
			sta |= (1 << c);
			f[sta] = std::max(f[sta], __builtin_popcount(sta));
		}
	}
	int lim = (1 << 20);
	for(int s = 0; s < lim; s++) g[s] = f[s];
	for(int i = 0; i <= 19; i++) {
		for(int s = 0; s < lim; s++) {
			if(s & (1 << i)) g[s] = std::max(g[s], g[s & (~(1 << i))]);
		}
	}
	
	for(int s = 0; s < lim; s++) {
		int s2 = (lim - 1) ^ s;
		if((!s || f[s]) && (!s2 || g[s2])) ans = std::max(ans, f[s] + g[s2]); 
	}
	std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	solve();

	return 0;
}

标签:子串,CF1234F,int,long,Substring,Yet,define
From: https://www.cnblogs.com/FireRaku/p/18235839

相关文章

  • SystemC & TLM-2.0 - TLM-2.0 Interoperability in SyetemC
    TML-2.0Interoperabilityabouttellingtointeroperabilitylet'sabouttellingtointeroperabilitylet'sstartbydefiningsometermsuntilthemtoaninitiatorisacomponentthatinitiatesnewtransactionsatargetisacomponentbutactsast......
  • 5-Longest Palindromic Substring-最长回文串
    问题描述链接:https://leetcode.com/problems/longest-palindromic-substring/description/Givenastring s,return thelongest palindromicsubstringins解释:给定一个字符串,求其最长的回文串回文串:一个字符串,如果从左往右读和从左往右读读出来的序列是一样的,称......
  • 「ABC353」Yet Another Sigma Problem
    题目字典树做法(用时187ms)#include<cstdio>#include<ctype.h>constintN=3e5+10;intn;longlongans;inttrans[N][26],cnt[N];inttot;chars[N];template<classT>voidread(T&x){ charc=getchar(); while(!isdigit(c))c=getchar()......
  • LeetCode 1915. Number of Wonderful Substrings
    原题链接在这里:https://leetcode.com/problems/number-of-wonderful-substrings/description/题目:A wonderful stringisastringwhere atmostone letterappearsan odd numberoftimes.Forexample, "ccjjc" and "abab" arewonderful,but "ab&......
  • Kibana系列---【重新启动kibana后,访问一直显示:Kibana server is not ready yet,查看
    重新启动kibana后,访问一直显示:Kibanaserverisnotreadyyet,查看后台错误日志报master_not_discovered_exception1.问题描述我的kibana之前都是好的,我把es集群重启之后,再重启kibana,发现无法访问了,访问时一直报:Kibanaserverisnotreadyyet,查看服务器后台日志后发现报:m......
  • ABC240Ex Sequence of Substrings
    ABC240ExSequenceofSubstringsLIS的好题改编。约定\(S(l,r)\)为字符串\(s\)中第\(l\)位到底\(r\)​位。\(S(l,r)<S(x,y)\)为字符串中\([l,r]\)的子串字典序比\([x,y]\)的子串小。前置LIS的\(n\logn\)求法。题解我们考虑按照类似于朴素LIS的方式设状......
  • ABC347B Substring
    题目描述给你一个由小写英文字母组成的字符串S,S有多少个不同的非空子串?子串是连续的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。数据范围:S是长度在1和100之间(含)的字符串,由小写英文字母组成。题解我认为这道题放在普及组的话,非常适合放在第一题和第二题之间,......
  • Codeforces 954I Yet Another String Matching Problem
    考虑到这个答案怎么算。能发现相当于是对应的字符间相连边,那么一个连通块中的字符就要变成同一个字符。于是一个连通块的代价就是\(sz-1\)。所以令有\(x\)个连通块,最后的代价就是\(|\Sigma|-x\)。考虑到因为\(|\Sigma|=6\),而\(B_6=203\)(贝尔数,\(B_n\)意义为大......
  • js substr 与 substring 有什么区别吗
    在JavaScript中,substr和substring是用于提取字符串的两个方法,它们的功能类似,但有一些区别:1.substr(start,length)方法:参数:start:必需。要提取的子字符串的起始位置。如果为负数,表示从字符串末尾开始计数。length:可选。要提取的字符数。如果省略或为负数,则提取到字符......
  • YetAnotherBoardGame
    Topcoder#搜索经典套路,我们发现枚举第一行后剩余的其实是确定的那么枚举并爆搜即可时间复杂度是\(3^k\)因为列的限制//Author:xiaruizeconstintN=13+10;intn,m;bools[N][N],bck[N][N];intop[N];voidupd(intx,inty,intty){if(ty==1)......