首页 > 其他分享 >Largest Subsequence

Largest Subsequence

时间:2024-01-05 15:12:45浏览次数:32  
标签:25 词性 int pos Subsequence Largest 序列 size

image
image
image
image
image

操作:选取词性最大的子序列,向右循环一次

问你进行多少次这样的操作能使数组有序,如果不能就输出-1

思路:首先要知道的是一个词性最大的序列整个右移过后,数组的新词性最大的序列就是之前的词性最大序列去了最后一个字母.

找出词性最大的子序列
                int n;
		string s;
		cin>>n>>s;
		for(int i=0;i<n;i++){
			pos[s[i]-'a'].push_back(i);
		}
		vector<int>a;
		int j=-1;
		for(int i=25;i>=0;i--){
			if(pos[i].size()==0)continue;
			for(auto c:pos[i]){
				if(c>j){
				a.push_back(c);
				j=c;	
				}
			}
		}

然后我们想的是这个子序列应该是循环到第一个字母到最后了就可以了,次数可能是序列的长度-1

但其实举个例子zzzeca -> zzzec -> zzze -> zzz 它实际上只用了3次就变成了有序,所有我们不妨猜测一下这个次数应该是子序列的长度-最大字母的个数。

#include<bits/stdc++.h>
using namespace std;
vector<int>pos[25];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;
	cin>>t;
	while(t--){
		for(int i=0;i<=25;i++){
			pos[i].clear(); 
		}
		int n;
		string s;
		cin>>n>>s;
		for(int i=0;i<n;i++){
			pos[s[i]-'a'].push_back(i);
		}
		vector<int>a;
		int j=-1;
		for(int i=25;i>=0;i--){
			if(pos[i].size()==0)continue;
			for(auto c:pos[i]){
				if(c>j){
				a.push_back(c);
				j=c;	
				}
			}
		}
		int cnt=0;
		for(int i=25;i>=0;i--){
			if(pos[i].size()!=0){
				cnt=pos[i].size();
				break;
			}
		}
		int m=a.size();
		for(int i=0;i<m/2;i++){
			int x=a[i];
			int y=a[m-i-1];
			swap(s[x],s[y]);
		}
		int f=0;
		for(int i=0;i<n-1;i++){
		if(s[i]>s[i+1]){
			f=1;
			break;
		}
	}
	f==1?cout<<-1<<"\n":cout<<a.size()-cnt<<"\n";
	}
	return 0;
} 

标签:25,词性,int,pos,Subsequence,Largest,序列,size
From: https://www.cnblogs.com/yufan1102/p/17947280

相关文章

  • [ABC271E] Subsequence Path 题解
    [ABC271E]SubsequencePath题解思路解析很好的一道题,很有迷惑性,表面上是一道图论实际上是dp,定义\(f_{i}\)为从\(1\)到\(i\)的最短“好路”。先把每条边对应的起点,终点和边权记录下来,然后输入每个\(e\),由于是子序列顺序不会改变,因此可以顺序进行操作。对于每一个\(e......
  • CF1621G Weighted Increasing Subsequences
    CF1621GWeightedIncreasingSubsequences你有一个长度为\(n\)的序列,定义\(a\)的一个长度为\(k\)的子序列为\(a_{i_1},a_{i_2},\dots,a_{i_k}\)。由此,我们不难发现,\(a\)的一个长度为\(k\)的子序列为上升子序列,当且仅当\(\forallj\in[1,k)\),\(a_{i_j}<a_{i_{j+1}}\)......
  • [Codeforces] CF1817A Almost Increasing Subsequence
    CF1817AAlmostIncreasingSubsequence题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\),\(z\),使得\(x\gey\ge\......
  • [ARC133B] Dividing Subsequence
    DividingSubsequence这道题与最长公共子序列类似,可以先去水一水那道题。题意本题就是让你从\(p\)里面选出一个子序列\(b_i\)和\(q\)里面选出一个子序列\(a_i\),我们要使\(b_i\)是\(a_i\)的倍数。解法本题直接用动态规划,是\(O(n^2)\)做法,会超时,因此我们用树状数......
  • [CF83E] Two Subsequences 题解
    [CF83E]TwoSubsequences题解思路定义\(overlap(a,b)\)为字符串\(a\)的后缀与\(b\)的前缀的最大相等的长度,有\(|f(a,b)|=|a|+|b|-overlap(a,b)\),下文称匹配为相邻两串的\(overlap\)。观察到每次操作之后,一定有一个序列是以\(a_i\)为结尾的。所以根据这个......
  • D2. Xor-Subsequence (hard version)
    D2.Xor-Subsequence(hardversion)Itisthehardversionoftheproblem.Theonlydifferenceisthatinthisversion$a_i\le10^9$.Youaregivenanarrayof$n$integers$a_0,a_1,a_2,\ldotsa_{n-1}$.Bryapwantstofindthelongestbeautifulsub......
  • 浏览器关于 Largest Contentful Paint (LCP) 的计算机制
    LargestContentfulPaint(LCP)是一种用户体验的性能指标,旨在帮助开发者了解用户在浏览网页时视觉渲染的速度。LCP主要衡量的是视觉上最大的页面元素何时出现在屏幕上,这包括图像元素、视频元素或者包含文本的元素(如段落或列表项)。如果LCP时间较长,用户可能会感觉到页面加载速......
  • 【刷题笔记】115. Distinct Subsequences
    题目Giventwostrings s and t,return thenumberofdistinctsubsequencesof s whichequals t.Astring's subsequence isanewstringformedfromtheoriginalstringbydeletingsome(canbenone)ofthecharacterswithoutdisturbingtheremainingch......
  • [USACO22OPEN] Up Down Subsequence P
    [USACO22OPEN]UpDownSubsequenceP注意到这个问题是不弱于直接求LIS的,因此考虑dp。设\(f_i\)表示以\(i\)结尾的最长这个什么串的长度,显然没办法直接转移,那么暴力的想法就是多设一维,这样自然就寄了。我们考虑到这样一件事情:如果我们假装对于所有的\(j\),\(j<f_i\)时......
  • SPOJ1805 HISTOGRA - Largest Rectangle in a Histogram 题解
    LinkSPOJ1805HISTOGRA-LargestRectangleinaHistogramQuestion在一条水平线上有\(n\)个高为\(a_i\)的矩形,求包含于这些矩形的最大子矩形面积。Solution我们定义\(L_i\)表示有\(a_i\)这个高度的一根悬线,往左最多能平移到什么位置初始化显然,\(a_i=i\)考虑转移......