set的插入删除
[解题思路]
循环接收每组用例,对于每组用例进行如下操作:
1. 依次获取每个状态,如果该状态是"connect",则将其id插入到set中,否则删除该id
2. 获取从刚开始到目前set中的最大值
3. 输出结果
#include<iostream> #include<unordered_set> using namespace std; int main() { int n; while(cin>>n) { string id,op; unordered_set<string> s; size_t maxv=0; //不可用int,因为s.size()为无符号整形 while(n--) { cin>>id>>op; if(op=="connect") s.insert(id); else s.erase(id); maxv=max(maxv,s.size());//若用int则无法比较 } cout<<maxv<<endl; } return 0; }
vector<string>的应用
[解题思路]
只要按照题面,将前缀字符串路径和相同路径剔除,只mkdir -p最长或者唯一路径就可以解决这
个问题
循环接收每组用例,对于每组用户进行如下操作
- 对改组用例按照字典顺序排序
- 将改组用例中相等的或者前一个是后一个子串的路径剔除
- 输入结果并换行
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; while(cin>>n) { vector<string> path(n);//提前初始化空间,push_back()很慢 for(int i=0;i<n;i++)//获得所有路径 cin>>path[i]; sort(path.begin(),path.end());//字典序排序 vector<bool> flag(n,true);//bool标记,实现伪删除 for(int i=0;i<n-1;i++) { if(path[i]==path[i+1]) flag[i]=false;//相等则删除 if(path[i].size()<path[i+1].size()&& path[i+1].substr(0,path[i].size()) == path[i]&& path[i+1][path[i].size()]=='/')//可能有/a和/ab情况 { flag[i]=false;//如果该串是另一个串的子串,删除 } } for(int i=0;i<n;i++) { if(flag[i]) cout<<"mkdir -p "<<path[i]<<endl;//输出没有被删除的 } cout<<endl; } return 0; }
排列难题: