当前位置:网站首页>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;
}
边栏推荐
猜你喜欢
随机推荐
已更新 联通 电信 tiny模式
力扣练习——45 二叉树的锯齿形层次遍历
使用GD32F207的高级定时器来产生PWM波出现的隐藏BUG
gergovia的交易tijie
从头开始实现YOLOV3
JDBC再回顾
Line generation 005
A Practical Arrangement of Map GIS Development Matters (Part 1)
(一)代码输出题 —— reverse
UE4 AI行为树实现随机和跟随移动
七月阅读:《刘慈欣科幻短篇小说集Ⅰ》笔记
其他重要协议(DNS,ICMP,NAT,交换机)
直播 | 7.30 ApacheCon Asia 2022 IOT/IIOT专题,IoTDB PMC 乔嘉林担任出品人
关于地图GIS的一次实践整理(下) Redis的GIS实践
IOT物联网概述及应用层架构入门篇
力扣 剑指 Offer 56 - I. 数组中数字出现的次数
gergovia's deal tijie
C语言:结构体总结
通关剑指 Offer——剑指 Offer II 008. 和大于等于 target 的最短子数组
单调队列模板 滑动窗口