其他分享
首页 > 其他分享> > 2022河南萌新联赛第(四)场:A.ZZULI(字符串)

2022河南萌新联赛第(四)场:A.ZZULI(字符串)

作者:互联网

https://ac.nowcoder.com/acm/contest/38487

题目描述 
给定一个由任意大写字母组成的字符串 s ,起初 s 的每一个位置都是独立的。现在你要根据 'ZZULI' 规则对位置进行连接。
'ZZULI' 规则如下:
对于两个下标 i,j (i<j),对于
s[i]=='Z'时,s[j]=='Z'||'U'||'L'||"I";
s[i]=='U'时,s[j]=='U'||'L'||'I'
s[i]=='L'时,s[j]=='L'||'I'
s[i]=='I'时,s[j]=='I'
**只有在这些情况下,i 与 j 可以相连。**
求连完边后**最大连通块**的大小。
示例1
输入
IABZUZU
输出
4
最大连通块内的位置为 {4,5,6,7}

示例2
输入
ILIL
输出
4
最大连通块内的位置为{1,2,3,4}
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string a="ZULI";//这道题目的实际要求就是求ZULI的非连续的最长子序列
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
	string s;
	cin>>s;
	map<char,int> mp;
	for(int i=0;i<s.size();i++)
    {
		mp[s[i]]++;//记录每一种字符的个数
	}
	int maxn=1;//题目只是要求了连通块,表明是ZULI的形式才可以往后接,但是单独一个的时候就没有要求,所以最短的个数就是一个
	//为什么是3欸?因为字符串a的长度是4,最小的那个也就是第三个:I
	for(int idx=3;idx>=0;idx--)//这里遍历的就是字符串a长度,指的是每次从哪个字符串出发能够得到的最长子序列
	{
		int j=idx,sum=0;
		for(int i=s.size()-1;i>=0;i--)//扫一遍这个字符串s,找一找我们需要的最长长度
		{
			if(j<0) break;//如果都直接搜到a的外边去了,赶紧退出来哇
			if(s[i]==a[j])
			{
				sum+=mp[a[j]];
				j--;//找到了就可以往前退
			}
		}
        cout<<sum<<endl;
		maxn=max(maxn,sum);
    }
	cout<<maxn<<endl;
	return 0;
}

标签:2022,示例,int,ZZULI,long,萌新,字符串,tie
来源: https://www.cnblogs.com/Vivian-0918/p/16559926.html