题意
文件同步(合并)
给你n个可以被忽略的目录,类似于 a/b/c/d 这样的文件夹或者model这样的文件,为gitignore,m个不能被忽略的这样的目录。如果一个文件夹里面不是所有的文件都能被忽略的话就不能忽略这个文件夹,否则可以直接忽略这个文件夹。
求最后至少需要多少个文件夹或文件才可以表示所有的文件夹或文件
思路
记录最初的个数ans=n
先对m个不可以被忽略的目录进行标记mp[]=1
在n个可以被忽略的目录中查找可以被忽略的有多少
如果mp[] = 1 ,在n个中查找的时候直接continue
如果mp[] = 0,就标记mp[]=2
如果mp[] = 2,就标记ans–(Because mp[]=2保留一个即可)
注意
在m个不可忽略的目录中的标记是标记某一个/前面的所有
例如:
data/test
标记的是mp[data]=1,mp[datatest]=1
代码
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
char a[1010][1010],b[1010][1010],c[1010],c1[1010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
map<string,int>mp;
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<m;i++)
scanf("%s",b[i]);
int ans=n;
for(int i=0;i<m;i++)
{
int l=strlen(b[i]);
int k=0;
for(int j=0;j<l;j++)
{
if(b[i][j]!='/')
c[k++]=b[i][j];
else
{
c[k]='\0';
mp[c]=1;
}
}
}
for(int i=0;i<n;i++)
{
int l=strlen(a[i]);
int k1=0;
for(int j=0;j<l;j++)
{
if(a[i][j]!='/')
c1[k1++]=a[i][j];
else
{
c1[k1]='\0';
if(mp[c1]==1)
continue;
else if(mp[c1]==0)
mp[c1]=2;
else if(mp[c1]==2)
{
ans--;
break;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}