Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- void make_graph(vector<vector<int>> &graph, int v, vector<bool> &vis){
- vis[v] = 1;
- for(int i = 0; i < 21; ++i){
- if((v >> i) & 1){
- int child = v ^ (1 << i);
- graph[v].push_back(child);
- if(vis[child] == 0){
- make_graph(graph, child, vis);
- }
- }
- }
- }
- void dfs(vector<vector<int>> &graph, vector<int> &pos, int val, int v){
- if(pos[v] <= val)
- return;
- pos[v] = val;
- for(int &child: graph[v]){
- if(pos[child] <= val)
- continue;
- dfs(graph, pos, val, child);
- }
- }
- public:
- vector<int> solve(int n, vector<string> &s, int Q, vector<string> &q){
- vector<int> ans;
- for(int i = 0; i < n; ++i){
- sort(s[i].begin(), s[i].end());
- auto it = unique(s[i].begin(), s[i].end());
- s[i].resize(it - s[i].begin());
- }
- for(int i = 0; i < Q; ++i){
- sort(q[i].begin(), q[i].end());
- }
- int N = (1 << 22) - 1;
- vector<vector<int>> graph(N + 1);
- vector<bool> vis(N + 1, 0);
- make_graph(graph, N, vis);
- vector<int> pos(N + 1, n + 1);
- for(int i = 0; i < n; ++i){
- int num = 0;
- for(int j = 0; j < s[i].size(); ++j){
- num += (1 << (s[i][j] - 'a'));
- }
- dfs(graph, pos, i, num);
- }
- for(int i = 0; i < Q; ++i){
- int num = 0;
- for(int j = 0; j < q[i].size(); ++j){
- num += (1 << (q[i][j] - 'a'));
- }
- if(pos[num] == n + 1)
- ans.push_back(-1);
- else
- ans.push_back(pos[num]);
- }
- return ans;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment