A - ZZULI
这道题由于要计算连通块大小,可以使用并查集,关键在于如何去合并。
对于
a
,
b
,
c
a,b,c
a,b,c ,
(
a
,
b
)
(a,b)
(a,b) 合并后
(
b
,
c
)
(b,c)
(b,c),与
(
a
,
b
)
(a,b)
(a,b) 合并
(
a
,
c
)
(a,c)
(a,c) 合并是没有区别的,那么要合并的一组数就用第一个去合并一遍。
所以拿第一个 Z
向后合并一遍,遇见 Z
、U
、L
、 I
就合并;
再拿第一个 U
按照规则向后合并一遍,再拿第一个 L
按照规则向后合并一遍,再拿第一个 I
按照规则向后合并一遍即可
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
char s[N];
int f[N],sz[N];
int d[4];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
void merge(int x,int y)
{
x=find(x),y=find(y);
if(x==y) return;
f[x]=y,sz[y]+=sz[x];
}
int main()
{
unordered_map<char,int> mp;
mp['Z']=0,mp['U']=1,mp['L']=2,mp['I']=3;
cin>>(s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++) f[i]=i,sz[i]=1;
for(int i=1;i<=n;i++)
if(mp.count(s[i]))
{
int pos=mp[s[i]];
if(d[pos]==0) d[pos]=i;
else merge(d[pos],i);
for(int j=0;j<pos;j++)
if(d[j])
merge(d[j],i);
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,sz[i]);
cout<<ans<<endl;
return 0;
}