题意:
给n个需要忽视的目录,m个需要保护的目录,求Gitignore的最小行数(有多少文件路径没被忽视--本应该被忽视的)
思路:
比赛的时候写了个神仙代码
正解应该就是模拟,标记被保护了的路径名父级目录(a/b/c就只标记a、b),因为输入保证不会同时出现:。接着枚举应该忽略的文件路径,如果某个父级目录或子级目录没有被保护,那么这个父级目录后面的子目录都要被忽视。
Code:
#include <bits/stdc++.h> using namespace std; vector<string>v1,v2; map<string,bool>vis,pro; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int n,m,t,ans; string s; cin>>t; while(t--) { cin>>n>>m; v1.clear(), v2.clear(), vis.clear(), pro.clear(); for(int i=1;i<=n;++i) cin>>s,v1.push_back(s); for(int i=1;i<=m;++i) cin>>s,v2.push_back(s); for(int i=0;i<m;++i) { s=""; for(char &ch : v2[i]) { if(ch=='/') pro[s]=true; s+=ch; } } ans=n; for(int i=0;i<n;++i) { s=""; for(char &ch : v1[i]) { if(ch=='/'&&!pro[s]) { if(vis[s]) --ans; else vis[s]=true; break; } s+=ch; } } cout<<ans<<endl; } }
比赛时候的思路
每个文件名看成一个点,'/'看成是边,那么每个点都加上路径、文件名这两个属性就能唯一确定一个点。(比赛的时候居然忘记加的属性是深度、文件名,太菜了、、
MyCode:
#include <bits/stdc++.h> using namespace std; const int N = 1e3 + 7; #define sc(x) scanf("%lld", &(x)) struct node { string name,path; bool operator<(const node &a)const{ if(path!=a.path) return path<a.path; return name<a.name; } }to[N]; int tot = 0; map<node, int> head; int Next[N]; map<node, bool> cnt,vis; void deal(string s, bool op) { vector<node> div; div.push_back(node{"QAQ",""}); string now = "",path=""; for (int i = 0, n = s.length(); i < n; ++i) { if (s[i] == '/') div.push_back(node{now,path}),path=path+"/"+now, now = ""; else now += s[i]; } div.push_back({now,path}); for (int i = 1, sz = div.size(); i < sz; ++i) { vis[div[i]] = op; to[++tot] = div[i]; Next[tot] = head[div[i - 1]]; head[div[i - 1]] = tot; } } int ans; void dfs(node u) { for (int i = head[u]; i; i = Next[i]) { if (vis[to[i]]) { dfs(to[i]); vis[to[i]]=false; cnt[to[i]]=true; } else if (!cnt[to[i]]) { ans += 1; cnt[to[i]] = true; } } } void init() { tot = 0; head.clear(); vis.clear(); cnt.clear(); ans = 0; } signed main() { int T; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> T; while (T--) { string s; int n, m; cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> s; deal(s, false); } for (int i = 0; i < m; ++i) { cin >> s; deal(s, true); } dfs(node{"QAQ",""}); cout << ans << endl; init(); } }