题解 CF20A BerOS file system

Posted seashellbaylor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 CF20A BerOS file system相关的知识,希望对你有一定的参考价值。

对于此题,我的心近乎崩溃

这道题,注意点没有什么,相信大佬们是可以自己写出来的 我是蒟蒻,那我是怎么写出来的啊

好了,废话少说,开始进入正题

这道题,首先我想到的是字符串的 erase 函数,一边运行一边删除多余的字符

但是……

在删除的同时,串长也会变化啊!!( 绝望

所以,在直接删的情况下:

for 不能用……

while 不能用……

do while 不能用……

这里,我又想到了……

正难则反

不减掉字符,就可以再定义一个字符串 ( 空串 ) 把满足的字符加进字符串里呀!!

这样,我们又可以得出满足字符的条件:

· 上一个字符不是 ‘ / ‘ ,但是这一个字符是 ‘ / ‘

· 数字

最后,如果最后一个字符是 ‘ / ‘ ,就删去它

所以,我们得出了核心代码:

ans+=s[0];
for(i=1;i<len;i++)
    if((s[i-1]!=‘/‘&&s[i]==‘/‘)||s[i]!=‘/‘)
        ans+=s[i],k++;

if(ans[k]==‘/‘)
    ans.erase(k);

很简单吧?

但是,你把代码放上去测,明显地……

WA辣!

证据:

技术图片

所以,我们留意到了特殊情况:

如果你输入了

/////

出来的是

nothing?

What ? 没有结果?

我瞬间认识到了:

我需要特判!!

所以,改进代码如下:

if(ans=="")//如果全是 ‘/‘ ,删完了的话
    cout<<"/";
else
    cout<<ans;

就这样结束了?

好像是的

所以,放出代码最终版:

#include<bits/stdc++.h>
using namespace std;//本蒟蒻总会写
int i,len,k;
string s,ans;
int main()
    getline(cin,s);
    len=s.size();
    ans+=s[0];
    for(i=1;i<len;i++)
        if((s[i-1]!=‘/‘&&s[i]==‘/‘)||s[i]!=‘/‘)
            ans+=s[i],k++;//记下ans有多少位
    
    if(ans[k]==‘/‘)
        ans.erase(k);//erase函数,温习一下
    if(ans=="")
        cout<<"/";
    else
        cout<<ans;
    return 0;

OI 加油!洛谷冲鸭!

以上是关于题解 CF20A BerOS file system的主要内容,如果未能解决你的问题,请参考以下文章

CF1512D Corrupted Array 题解

题解CF519E

题解-比赛CF1332

CF398B题解

CF1354&CF1355 简要题解

题解 CF359D