P8824 [传智杯 #3 初赛] 终端 题解

· · 题解

P8824 [传智杯 #3 初赛] 终端 题解

题目传送门

思路分析

模拟。

思来想去,决定使用 list

原因有一下几点:

我们要维护链表中数的顺序为插入的顺序。

对于 touch filename:

顺序访问链表,若没有 filename 就插入一个。

if(a=="touch"){
    string b;
    cin>>b;
    bool fou=false;
    for(it=s.begin();it!=s.end();it++){
        if(*it==b){
            fou=true;
            break;
        }
    }
    if(fou==false){
        s.push_back(b);
    }
}

对于 rm name:

顺序访问链表,碰到 name 就删除。

if(a=="rm"){
    string b;
    cin>>b;
    bool fou=false;
    for(it=s.begin();it!=s.end();it++){
        if(*it==b){
            fou=true;
            break;
        }
    }
    if(fou==true){
        s.erase(it);
    }
}

对于 ls:

顺序访问链表,直接输出。

if(a=="ls"){
    bool fou=false;
    for(it=s.begin();it!=s.end();it++){
        cout<<*it<<endl;
    }
}

对于 rename xxx yyy:

顺序访问链表,碰到 xxx 就替换成 yyy

if(a=="rename"){
    string x,y;
    cin>>x>>y;
    bool fou=false;
    for(it=s.begin();it!=s.end();it++){
        if(*it==x){
            fou=true;
            break;
        }
    }
    if(fou==true){
        *it=y;
    }
}

代码

就是以上四种情况的合并。

#include<iostream>
#include<list>
using namespace std;
int m;
list<string> s;
list<string>::iterator it;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        string a;
        cin>>a;
        if(a=="touch"){
            string b;
            cin>>b;
            bool fou=false;
            for(it=s.begin();it!=s.end();it++){
                if(*it==b){
                    fou=true;
                    break;
                }
            }
            if(fou==false){
                s.push_back(b);
            }
        }
        if(a=="rm"){
            string b;
            cin>>b;
            bool fou=false;
            for(it=s.begin();it!=s.end();it++){
                if(*it==b){
                    fou=true;
                    break;
                }
            }
            if(fou==true){
                s.erase(it);
            }
        }
        if(a=="ls"){
            bool fou=false;
            for(it=s.begin();it!=s.end();it++){
                cout<<*it<<endl;
            }
        }
        if(a=="rename"){
            string x,y;
            cin>>x>>y;
            bool fou=false;
            for(it=s.begin();it!=s.end();it++){
                if(*it==x){
                    fou=true;
                    break;
                }
            }
            if(fou==true){
                *it=y;
            }
        }
    } 
    return 0;
}