250pt:
题意:给定n个网站,以及n个网站的关键词,还有一个危险词库。如果一个网站的关键词中>=th的危险词,那么这个网站便是危险的。同时,他的所有关键词加入危险词库。问,有多少个危险网站。
思路:直接模拟。
code:
1 #line 7 "InternetSecurity.cpp" 2 #include <cstdlib> 3 #include <cctype> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <vector> 9 #include <string> 10 #include <iostream> 11 #include <sstream> 12 #include <map> 13 #include <set> 14 #include <queue> 15 #include <stack> 16 #include <fstream> 17 #include <numeric> 18 #include <iomanip> 19 #include <bitset> 20 #include <list> 21 #include <stdexcept> 22 #include <functional> 23 #include <utility> 24 #include <ctime> 25 using namespace std; 26 27 #define PB push_back 28 #define MP make_pair 29 30 #define REP(i,n) for(i=0;i<(n);++i) 31 #define FOR(i,l,h) for(i=(l);i<=(h);++i) 32 #define FORD(i,h,l) for(i=(h);i>=(l);--i) 33 34 typedef vector<int> VI; 35 typedef vector<string> VS; 36 typedef vector<double> VD; 37 typedef long long LL; 38 typedef pair<int,int> PII; 39 40 41 class InternetSecurity 42 { 43 public: 44 vector<string> A[400]; 45 bool v[400]; 46 vector <string> determineWebsite(vector <string> wbs, vector <string> key, vector <string> dan, int th) 47 { 48 for (int i = 0; i < key.size(); ++i){ 49 string tmp; 50 stringstream ss; 51 A[i].clear(); 52 ss << key[i]; 53 while (ss >> tmp) A[i].PB(tmp); 54 // cout << A[i][A[i].size() - 1] << endl; 55 } 56 set<string> S; 57 memset(v, 0, sizeof(v)); 58 for (int i = 0; i < dan.size(); ++i) S.insert(dan[i]); 59 bool keepLooking = true; 60 while (keepLooking){ 61 keepLooking = false; 62 for (int i = 0; i < key.size(); ++i) 63 if (!v[i]){ 64 int cnt = 0; 65 for (int j = 0; j < A[i].size(); ++j) 66 if (S.find(A[i][j]) != S.end()) ++cnt; 67 if (cnt >= th){ 68 keepLooking = true; 69 v[i] = true; 70 for (int j = 0; j < A[i].size(); ++j) 71 S.insert(A[i][j]); 72 } 73 } 74 } 75 vector<string> ans; 76 ans.clear(); 77 for (int i = 0; i < key.size(); ++i) 78 if (v[i]) ans.PB(wbs[i]); 79 return ans; 80 } 81 };
450pt:
题意:给定一个DAG的客户机及服务器之间的关系,服务器只有入边。现在求在那些边上装一些安全设置,使得所有客户机到服务器至少都有经过一个安全设置的边。
思路:因为是DAG,那么直接对原图进行一边搜索,记录直接点的状态,转移到根状态
code:
1 #line 7 "NetworkSecurity.cpp" 2 #include <cstdlib> 3 #include <cctype> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <vector> 9 #include <string> 10 #include <iostream> 11 #include <sstream> 12 #include <map> 13 #include <set> 14 #include <queue> 15 #include <stack> 16 #include <fstream> 17 #include <numeric> 18 #include <iomanip> 19 #include <bitset> 20 #include <list> 21 #include <stdexcept> 22 #include <functional> 23 #include <utility> 24 #include <ctime> 25 using namespace std; 26 27 #define PB push_back 28 #define MP make_pair 29 30 #define REP(i,n) for(i=0;i<(n);++i) 31 #define FOR(i,l,h) for(i=(l);i<=(h);++i) 32 #define FORD(i,h,l) for(i=(h);i>=(l);--i) 33 34 typedef vector<int> VI; 35 typedef vector<string> VS; 36 typedef vector<double> VD; 37 typedef long long LL; 38 typedef pair<int,int> PII; 39 40 41 class NetworkSecurity 42 { 43 public: 44 int n, m, ans; 45 bool vis[1010]; 46 vector<string> S, C; 47 long long S1[200]; 48 void dfs(int u){ 49 if (vis[u]) return; 50 vis[u] = true; 51 S1[u] = 0; 52 for (int i = 0; i < C[u].size(); ++i) 53 if (C[u][i] == 'Y'){ 54 dfs(i); 55 S1[u] |= S1[i]; 56 } 57 for (int i = 0; i < S[u].size(); ++i) 58 if (S[u][i] == 'Y'){ 59 if (!((1LL << i) & S1[u])){ 60 ++ans; 61 S1[u] |= (1LL << i); 62 } 63 } 64 } 65 int secureNetwork(vector <string> clientCable, vector <string> serverCable) 66 { 67 ans = 0; 68 S = serverCable; 69 C = clientCable; 70 memset(vis, 0, sizeof(vis)); 71 for (int i = 0; i < S.size(); ++i) 72 if(!vis[i]) dfs(i); 73 return ans; 74 } 75 };