当前位置:网站首页>2022河南萌新联赛第(四)场:郑州轻工业大学 A - ZZULI
2022河南萌新联赛第(四)场:郑州轻工业大学 A - ZZULI
2022-08-02 04:31:00 【WA_自动机】
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;
}
边栏推荐
猜你喜欢
随机推荐
学内核之四:关于内核与硬件的衔接
【STM32】 ADC模数转换
C语言特殊运算符
A practice arrangement about map GIS (below) GIS practice of Redis
分享|5G+智慧工业园区解决方案(附PDF)
P1012 [NOIP1998 提高组] 拼数
压缩包密码如何快速删除?
棋盘问题(DAY 94)
6个月测试经验,面试跳槽狮子大开口要18K,只会点点点,给我整无语了。。
MySQL存储函数详解
STM32 OLED显示屏
CubeSat Light-1
gergovia的交易tijie
vs2022 编译libmodbus源码
安装部署 Kubernetes 仪表板(Dashboard)
高等数学(第七版)同济大学 总习题三(前10题) 个人解答
抓住那头牛(DAY 96)
【云原生】什么是CI/CD? | CI/CD 带来的好处
物联网通信协议全解析
【Interview】Recruitment requirements









