首页 > 其他分享 >CF158C Cd and pwd commands 题解

CF158C Cd and pwd commands 题解

时间:2024-04-10 21:47:33浏览次数:20  
标签:ch 题解 ll pwd p1 CF158C include buf out

题面

大模拟,但是有坑点。

思路

依照题意模拟。用一个字符串 \(out\) 记录在进行了 \(i\) 次操作后如果要输出输出的东西,字符串 \(in\) 和 \(s\) 来分别记录输入的操作及操作类型。

由于输出的第一个字符一定是 /,所以可以直接将 \(out\) 的初始化定为 out = "/"。这样子可以省去很多麻烦。又因为输出的最后一个字符也一定是 /,而输入的字符串 \(in\) 最后一定不带 /,所以可以直接在后面加上一个 /,像 in = in + '/' 这样。

当然,要特判绝对路径的情况,这个时候的 \(in\) 的第一个字符就是 /,没必要再加。即使是绝对路径也会有删除操作,这里需要注意!!!

遍历一遍输入的 \(in\),用一个变量 \(last\) 来记录对于当前in[i] = '/' 时的上一个 / 的位置。调用函数 check(last , i) 来操作。

传入的其实就是两个 / 的位置,每次都对这两个位置间的字符串进行操作。特判当长度为二时是否是删除操作,是的话就调用函数 del()。不是的话就将这一段加入到 \(out\) 中,调用函数 add(l , r),其中 \(l\) 为上面的 \(last\),\(r\) 为上面的 \(i\)。

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<stdio.h>
#define ll long long
#define inf 0x3f3f3f3f
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
#pragma comment(linker , "/stack : 200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
inline char gchar()
{
    static char buf[1000000] , *p1 = buf , *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 1000000 , stdin) , p1 == p2) ? EOF : *p1++;
}
inline ll read()
{
    ll x = 0 , f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9')
	  {
        if(ch == '-')
        {
        	f = -1;
		}
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
	  {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
ll n;
string s , in , out;
inline void del()
{
    ll len_out = out.size();
    if(len_out == 1)
    {
        return ;
    }
    ll L = 0 , R = 0;
    fo(i , len_out - 1 , 0)
    {
        if(out[i] == '/' && R == 0)
        {
            R = i;
            continue;
        }
        if(out[i] == '/' && R != 0)
        {
            L = i;
            break;
        }
    }
    // printf("del : L = %lld R =  %lld\n" , L , R);
    out.erase(L + 1 , R);//从L + 1开始就不需要加回‘/’了
    // cout << "out = " << out << endl;
}
inline void add(ll L , ll R)
{
    string kkk;
    fr(i , L + 1 , R)
    {
        kkk += in[i];
    }
    out += kkk;
    // cout << "out = " << out << endl;
}
inline void check(ll l , ll r)
{
    if(r - l - 1 == 2)
    {
        if(in[l + 1] == '.' && in[r - 1] == '.')
        {
            del();
        }
        else
        {
            add(l , r);
        }
    }
    else
    {
        add(l , r);
    }
}
signed main()
{
    n  = read();
    out = "/";
    while(n--)
    {
        cin >> s;
        if(s == "pwd")
        {
            cout << out;
            puts("");
        }
        else if(s == "cd")
        {
            cin >> in;
            in = in + '/';
            if(in[0] == '/')
            {
                out = "/";
            }
            else
            {
                in = '/' + in;
            }
            ll len = in.size() , last = 0;
            fr(i , 0 , len - 1)
            {
                if(in[i] == '/')
                {
                    // cout << in;
                    // puts("");
                    // printf("check : l = %lld r =  %lld\n" , last , i);
                    check(last , i);
                    last = i;
                }
            }
        }
    }
    system("pause");
    return 0;
}

总结

其实模拟方法有很多,这个是最朴素的一种,一开始思路就这样想,没有优化就交了。

标签:ch,题解,ll,pwd,p1,CF158C,include,buf,out
From: https://www.cnblogs.com/xhqdmmz/p/18127539

相关文章

  • CF875B Sorting the Coins 题解
    题面。算是比较简单的题目了,自己多手出几个样例就可以发现规律了。强烈建议多读几遍题目!!!!思路设0表示硬币朝上,1表示硬币朝下,则第\(0\)次与第\(n\)操作一定输出\(1\)。因为没有可以操作的对象,前者是由于全部硬币朝上,后者是由于全部硬币朝下,即使没有操作也要遍历一遍。注......
  • CF121A Lucky Sum 题解
    题面。不好意思,又双把通过率拉低了。在CF上交了22次才过。这里给出不同的写法。思路规律其他题解写得都很好,这里不需要再讲述如何推出规律。预处理出前\(5000\)个符合要求的数(其实我也不知道处理多少个刚好够,就随便写了一个数)。接下来借用到一点分块思想,将整个\([l,r]\)......
  • CF1670B Dorms War 题解
    题面。不好意思,把这道题的通过率拉低了,但坑点确实有。思路多出几个数据,我们可以发现,在不报警的前提下,最多可以操作数量是两个特殊字符间的最长距离。解释对于不报警的定义是:每次删除操作进行前,当前的字符串中的所有特殊字符的前一个位置必须不是特殊字符。换句话说,只要当前......
  • CF1817A Almost Increasing Subsequence 题解
    题面。2023.5.18修正关于前缀和数组的说法,与代码适配的思路。题意给定长度为\(n\)一个序列\(a\)以及\(q\)次询问,每次询问给出\(l\)和\(r\),要求找出序列\(a\)在\([l,r]\)内最长的几乎递增子序列。对于几乎递增的定义:如果一个序列中不存在连续的三个数\(x\),\(y\)......
  • CF1737C Ela and Crickets 题解
    题面。原先大佬的题解写的很好,但这里想讲一下不同做法。思路题目中说的\(L\)型有四种情况,很容易就可以想到特殊情况,那就是\(L\)型恰好贴在棋盘的四个角上,这时我们发现,这样子棋子只能在棋盘的其中两条边上移动。对于四个角我们进行四次特判。看普通情况,在手动模拟完样例后......
  • CF1162B Double Matrix 题解
    传送门说句实话,如果不是先写了Showstopper这道题的话,我应该会在这里卡很久,因为做Showstopper我就卡了很久QwQ。思路太像了,实在是太像了,与Showstopper想比,仅仅就是换成二维数组,求最大值变为找递增矩阵,处理方法一模一样:将数组\(a\)和\(b\)中较小的值存在一个数组里,较......
  • 【华为笔试题汇总】2024-04-10-华为春招笔试题-三语言题解(Python/Java/Cpp)
    ......
  • 关于淘宝镜像过期问题解决方案
    问题:将项目拷贝到另一台电脑启动时报错Error:Theprojectseemstorequireyarnbutit'snotinstalled解决方法:1.删除项目中的yarn.lock文件2.终端执行npminstall-gyarn再次启动项目npmrunserve就可以了......
  • Codeforces Round 938 (Div. 3) A-H 题解
    A-YogurtSaleSolution当\(2a>b\)时,显然用\(a\)来买两个比较好,否则就用\(b\)来买两个比较好Code#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn;cin>>n;inta,b;cin>>a>>b;b=min(b,a*2);int......
  • AT_agc038_e [AGC038E] Gachapon 题解
    比较基础的一道题。很容易想到Min-Max容斥:\[E(\max(S))=\sum_{T\subeS}(-1)^{|T|-1}\timesE(\min(T))\]然后发现\(E(\min(T))=\sum_{k\ge0}P(\min(T)\gek)\)。考虑dp,记\(f_{i,j,k}\)表示从前\(i\)个数中选出\(T\),\(\sum_{i\inT}A_i=j,\sum_{i\inT}c_i=k\)且每个......