题目链接:http://codeforces.com/gym/102900/problem/M
题意:给出n个要删除的文件路径,同时给出m个不能删除的文件路径。每次删除都只能删除一个文件或者一个文件夹(和该文件夹内的所有文件),问最少需要删除多少个路径
解题思路:
这题直接模拟即可,将n个要删除的放在str1组中,将m个不能删除的放在str2组中,先将m个不能删除的所包含的路径全部标记为1,再去处理n个要删除的路径。
当处理到的路径未被标记(即标记为0),那么可以直接删除掉,并将该路径标记为2。
如果处理到的路径标记为1,说明该路径不可被删除。
如果处理到的路径被标记为2,说明该路径已经被删除过不需要再去处理。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
using namespace std;
#define ll long long
const int mod = 1e9 + 7;
int n, m;
int t;
int ans;
map<string, int> mp;
string str1[110], str2[110];
int main() {
cin >> t;
while (t--) {
ans = 0;
mp.clear();
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> str1[i];
for (int i = 0; i < m; i++)
cin >> str2[i];
for (int i = 0; i < m; i++) {
int sz = str2[i].size();
string tmp = "";
for (int j = 0; j < sz; j++) {
tmp += str2[i][j];
if (str2[i][j] == '/') {
mp[tmp] = 1; //标记为不可删除
}
}
}
ans = n;
for (int i = 0; i < n; i++) {
int sz = str1[i].size();
string tmp = "";
for (int j = 0; j < sz; j++) {
tmp += str1[i][j];
if (str1[i][j] == '/') {
if (mp[tmp] == 0) //当tmp可以删除时
mp[tmp] = 2;
else if (mp[tmp] == 2) { //当再次遇到可以删除的tmp时
ans--;
break;
}
}
}
}
cout << ans << endl;
}
return 0;
}