就是一个简单的并查集,考虑合并就好了没啥思维量。
#include<bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);#define fel(i,x,y) for(int i=x;i<=y;i++)#define fhl(i,x,y) for(int i=x;i>=y;i--)#define inf 0x3fffffff#define ll long long#define pb push_back#define endl "\n"//感觉就是找最前面四个字符zuli的最大连通块const int N=1e6+100;string s;int p[N];int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x];}map<int,int>mp;int main(){ cin>>s; int l=s.length(); int pos=l+1; for(int i=0;i<l;i++) p[i]=i; for(int i=0;i<l;i++){ if(s[i]=='Z'){ pos=i; break; } } for(int i=pos+1;i<l;i++){ if(s[i]=='Z'||s[i]=='U'||s[i]=='L'||s[i]=='I'){ if(find(pos)!=find(i)){ p[find(i)]=p[find(pos)]; } } } pos=l+1; for(int i=0;i<l;i++){ if(s[i]=='U'){ pos