思路:
- 将可删除的串标记上1,不可删除的串标记上0。
- 通过dfs得到答案,遇到1直接++,遇到0则访问子树。
#include <bits/stdc++.h>
using namespace std;
int n,m,tot,method[2050];
map<string,int> trie[2050];
char str[2050];
queue<string> q;
void init(){
for(int i=0;i<=tot;i++){
method[i] = 0;
trie[i].clear();
}
tot = 0;
}
void split(char* s){
string pat="";
int len = strlen(s);
s[len] = '/';
for(int i=0;i<=len;i++){
if(s[i]=='/') q.push(pat), pat = "";
else pat += s[i];
}
}
void insert(char* s,int med){
split(s);
int rt = 0;
while(!q.empty()){
string now = q.front();
q.pop();
if(trie[rt].find(now)==trie[rt].end()){
trie[rt][now] = ++tot;
}
rt = trie[rt][now];
method[rt] = med;
}
}
int dfs(int rt){
int res = 0;
for(auto i:trie[rt]){
if(method[i.second]==1) res++;
else res+=dfs(i.second);
}
return res;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",str);
insert(str,1);
}
for(int i=0;i<m;i++){
scanf("%s",str);
insert(str,0);
}
printf("%d\n",dfs(0));
}
return 0;
}