P8824 [传智杯 #3 初赛] 终端 题解
ChrisWangZi · · 题解
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;
}