- 来源:2094(Div4)D-CF
- 题意:给定两个仅由
L
与R
组成的字符串
p
p
p 和
s
s
s,对于原字符串中的每个字符,可进行如下操作:在左侧或右侧复制该字符,复制出的字符不可进行操作。每个字符最多只能操作
1
1
1 次,也可不操作。判断
s
s
s 是否为经过操作
p
p
p 后所得到。 - 关键词:模拟(签到)
- 题解:先预处理去重,并计数在该段内重复次数。若去重后的数组大小不相等则直接无解,否则逐位比较数组:若出现字符不同则无解,若重复次数
s
<
p
s<p
s<p或
s
>
2
p
s>2p
s>2p则无解,其他情形则有解。
- Fun Fact:2024 ICPC香港站题目LRString为本题的Hard版,博主也写过该题题解,感兴趣请移步
- 代码:
#include<bits/stdc++.h>
using namespace std;
using pci=pair<char,int>;
#define fi first
#define se second
void solve(){
string p,s;cin>>p>>s;
vector<pci>pp,ss;
int i=0;
while(i<p.size()){
int j=i;
while(j<p.size()&&p[j]==p[i]) j++;
pp.push_back({p[i],j-i});
i=j;
}
i=0;
while(i<s.size()){
int j=i;
while(j<s.size()&&s[j]==s[i]) j++;
ss.push_back({s[i],j-i});
i=j;
}
if(pp.size()!=ss.size()) cout<<"No\n";
else{
for(int i=0;i<pp.size();i++)
if(pp[i].fi!=ss[i].fi||ss[i].se<pp[i].se||ss[i].se>(pp[i].se<<1)){
cout<<"No\n";
return;
}
cout<<"Yes\n";
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int t=1;cin>>t;
while(t--) solve();
return 0;
}