CF319D

· · 题解

感觉此题有点水,考场上写了个玄学做法居然过了。。。

点我返回题面

题目大意:

给你一个字符串,要求你每次都找到最短(相同则最靠前)的形如 XX 的子串,把其中一个 X 删掉,直至没有这样的子串。求出最后的字符串。

思路分析

我们直接考虑依次模拟即可。

因为题目要求每次都找长度最短的,所以我们先枚举一个长度,然后枚举从第 i 位开始,然后判断一下即可。

因为是模拟,所以细节请看代码(其实也没有什么细节。。。)

CODE

#include<bits/stdc++.h>
using namespace std;
string s;//输入的字符串
signed main(){
    cin>>s;
    int len=s.size();//取出长度
    for(int cnt=1;cnt<=len/2;cnt++){//枚举长度,从小到大
        for(int j=0;j<len-cnt+1;j++){//枚举开始判断的位置
            bool flag=1;
            for(int k=0;k<cnt;k++){//枚举判断的位置
                if (s[j+k]!=s[j+k+cnt]){//如果失败,则退出
                    flag=0;
                    break;
                }
            }
            if(flag){//如果成功了
                s.erase(j,cnt);//将 "X" 从字符串中删除
                len-=cnt;//更新总长度
                j--;
            }
        }
    }
    cout<<s<<endl;
    return 0;
}