[题解]CF 2094D - Tung Tung Sahur

  • 来源:2094(Div4)D-CF
  • 题意:给定两个仅由LR组成的字符串 \(p\)\(s\),对于原字符串中的每个字符,可进行如下操作:在左侧或右侧复制该字符,复制出的字符不可进行操作。每个字符最多只能操作 \(1\) 次,也可不操作。判断 \(s\) 是否为经过操作 \(p\) 后所得到。
  • 关键词:模拟(签到)
  • 题解:先预处理去重,并计数在该段内重复次数。若去重后的数组大小不相等则直接无解,否则逐位比较数组:若出现字符不同则无解,若重复次数\(s<p\)\(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;
}
posted @ 2025-04-22 11:21  椰萝Yerosius  阅读(70)  评论(0)    收藏  举报