CF319D题解

最后更新于 2025-08-03 10:09:58
作者
分类 题解

题面

题目传送门

题目大意:

给定一个字符串,每次把最靠左的连续两个字串删掉一个,问最终的字符串。

思路

本刚看这道题的蒟蒻被一个时限 $6s$ 的紫题给惊呆了……

这道题的思路真的真的很简单,暴力都能过,根据题意模拟,用双循环枚举重复单个子串的长度和重复子串的位置即可。不过还是要注意一下枚举的范围,子串长度是从 $0$ 到字符串长度的一半(最多就是两个子串重复构成的字符串),初始范围是从 $0$ 到字符串长度减去当前枚举的子串长度。

代码

这里奉上一个最短代码。

#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
    cin>>s;
    for(int len=1;len<=(s.size()>>1);len++)//枚举长度。s.size()/2改成s.size()>>1更快
        for(int i=0;i<=s.size()-len;i++)//枚举位置
            if(s.substr(i,len)==s.substr(i+len,len))如果这两段是相同的
                s.erase(i--,len);//删掉前面的那个串。i--是为了一删到底,有可能删了之后还能继续删
    cout<<s;
    return 0;
}

对了,真的很水,建议降级