diff --git a/solution/0700-0799/0770.Basic Calculator IV/solutions.cpp b/solution/0700-0799/0770.Basic Calculator IV/solutions.cpp new file mode 100644 index 0000000000000..6b8645453d6f0 --- /dev/null +++ b/solution/0700-0799/0770.Basic Calculator IV/solutions.cpp @@ -0,0 +1,42 @@ +#include <bits/stdc++.h> +using namespace std; +struct Poly{ + map<vector<string>, long> d; + Poly(long v=0){ if(v) d[{}]=v; } + Poly(const string &s){ d[{s}]=1; } +}; +Poly add(const Poly &a,const Poly &b){ Poly r=a; for(auto &p:b.d) r.d[p.first]+=p.second; for(auto it=r.d.begin();it!=r.d.end();){ if(it->second==0) r.d.erase(it++); else ++it;} return r; } +Poly sub(const Poly &a,const Poly &b){ Poly r=a; for(auto &p:b.d) r.d[p.first]-=p.second; for(auto it=r.d.begin();it!=r.d.end();){ if(it->second==0) r.d.erase(it++); else ++it;} return r; } +Poly mul(const Poly &a,const Poly &b){ Poly r; for(auto &p:a.d) for(auto &q:b.d){ auto v=p.first; v.insert(v.end(),q.first.begin(),q.first.end()); sort(v.begin(),v.end()); r.d[v]+=p.second*q.second; } for(auto it=r.d.begin();it!=r.d.end();){ if(it->second==0) r.d.erase(it++); else ++it;} return r; } +class Solution { +public: + vector<string> basicCalculatorIV(string expr, vector<string>& evv, vector<int>& evi){ + unordered_map<string,long> mp; + for(int i=0;i<evv.size();i++) mp[evv[i]] = evi[i]; + vector<string> toks; + string t; + for(char c:expr){ + if(c==' '){ if(!t.empty()){ toks.push_back(t); t.clear(); }} + else if(strchr("()+-*",c)){ + if(!t.empty()){ toks.push_back(t); t.clear(); } + toks.push_back(string(1,c)); + } else t.push_back(c); + } + if(!t.empty()) toks.push_back(t); + int i=0; + function<Poly()> parseE, parseT, parseP; + parseP = [&]{ string s=toks[i++]; if(s=="("){ Poly r = parseE(); i++; return r;} if(isdigit(s[0])) return Poly(stol(s)); return mp.count(s)? Poly(mp[s]) : Poly(s); }; + parseT = [&]{ Poly r=parseP(); while(i<toks.size() && toks[i]=="*"){ i++; r = mul(r, parseP()); } return r; }; + parseE = [&]{ Poly r=parseT(); while(i<toks.size()&&(toks[i]=="+"||toks[i]=="-")){ string op=toks[i++]; Poly p=parseT(); r = (op=="+"? add(r,p) : sub(r,p)); } return r; }; + Poly res = parseE(); + vector<pair<vector<string>,long>> v(res.d.begin(), res.d.end()); + sort(v.begin(), v.end(), [](auto &a, auto &b){ if(a.first.size()!=b.first.size()) return a.first.size()>b.first.size(); return a.first<b.first; }); + vector<string> ans; + for(auto &p:v) if(p.second){ + string s = to_string(p.second); + for(auto &var:p.first) s += "*" + var; + ans.push_back(s); + } + return ans; + } +}; \ No newline at end of file diff --git a/solution/2000-2099/2045.Second Minimum Time to Reach Destination/Solutions.cpp b/solution/2000-2099/2045.Second Minimum Time to Reach Destination/Solutions.cpp new file mode 100644 index 0000000000000..5451622e9f44c --- /dev/null +++ b/solution/2000-2099/2045.Second Minimum Time to Reach Destination/Solutions.cpp @@ -0,0 +1,40 @@ +#include <array> +#include <climits> +#include <queue> +#include <vector> +using namespace std; + +class Solution { +public: + int secondMinimum(int n, vector<vector<int>>& edges, int time, int change) { + vector<vector<int>> adj(n + 1); + for (auto& e : edges) { + adj[e[0]].push_back(e[1]); + adj[e[1]].push_back(e[0]); + } + vector<array<int, 2>> dist(n + 1, {INT_MAX, INT_MAX}); + queue<pair<int, int>> q; + dist[1][0] = 0; + q.emplace(1, 0); + + while (!q.empty()) { + auto [u, t] = q.front(); + q.pop(); + for (int v : adj[u]) { + int cycles = t / change; + int wait = (cycles % 2 == 1 ? change - (t % change) : 0); + int t2 = t + wait + time; + if (t2 < dist[v][0]) { + dist[v][1] = dist[v][0]; + dist[v][0] = t2; + q.emplace(v, t2); + } else if (t2 > dist[v][0] && t2 < dist[v][1]) { + dist[v][1] = t2; + q.emplace(v, t2); + } + } + } + + return dist[n][1]; + } +}; \ No newline at end of file diff --git a/solution/3400-3499/3435.Frequencies of Shortest Supersequences/Solutions.cpp b/solution/3400-3499/3435.Frequencies of Shortest Supersequences/Solutions.cpp new file mode 100644 index 0000000000000..367da39f60a8c --- /dev/null +++ b/solution/3400-3499/3435.Frequencies of Shortest Supersequences/Solutions.cpp @@ -0,0 +1,248 @@ +#include <vector> +#include <string> +#include <queue> +#include <stack> +#include <set> +#include <functional> +using namespace std; + +class Solution +{ +public: + vector<vector<int>> supersequences(vector<string> &words) + { + const int ALPHA = 26; + bool used[ALPHA] = {}; + for (auto &w : words) + for (char c : w) + used[c - 'a'] = true; + + vector<int> charMap(ALPHA, -1); + vector<char> chars; + int charCount = 0; + for (int c = 0; c < ALPHA; c++) + { + if (used[c]) + { + charMap[c] = charCount++; + chars.push_back('a' + c); + } + } + + vector<vector<bool>> graph(charCount, vector<bool>(charCount)); + vector<bool> selfLoop(charCount); + for (auto &w : words) + { + int u = charMap[w[0] - 'a'], v = charMap[w[1] - 'a']; + if (u == v) + selfLoop[u] = true; + else + graph[u][v] = true; + } + + vector<int> disc(charCount, -1), low(charCount), comp(charCount, -1); + vector<bool> inStack(charCount); + stack<int> stk; + int time = 0, sccTotal = 0; + + function<void(int)> tarjan = [&](int u) + { + disc[u] = low[u] = time++; + stk.push(u); + inStack[u] = true; + + for (int v = 0; v < charCount; v++) + { + if (!graph[u][v]) + continue; + if (disc[v] == -1) + { + tarjan(v); + low[u] = min(low[u], low[v]); + } + else if (inStack[v]) + { + low[u] = min(low[u], disc[v]); + } + } + + if (low[u] == disc[u]) + { + while (true) + { + int v = stk.top(); + stk.pop(); + inStack[v] = false; + comp[v] = sccTotal; + if (v == u) + break; + } + sccTotal++; + } + }; + + for (int i = 0; i < charCount; i++) + if (disc[i] == -1) + tarjan(i); + + vector<vector<int>> sccGroups(sccTotal); + for (int i = 0; i < charCount; i++) + sccGroups[comp[i]].push_back(i); + + vector<vector<int>> sccGraph(sccTotal); + vector<int> inDegree(sccTotal); + for (int u = 0; u < charCount; u++) + { + for (int v = 0; v < charCount; v++) + { + if (graph[u][v] && comp[u] != comp[v]) + { + sccGraph[comp[u]].push_back(comp[v]); + inDegree[comp[v]]++; + } + } + } + + queue<int> q; + vector<int> topoOrder; + for (int i = 0; i < sccTotal; i++) + if (inDegree[i] == 0) + q.push(i); + + while (!q.empty()) + { + int u = q.front(); + q.pop(); + topoOrder.push_back(u); + for (int v : sccGraph[u]) + { + if (--inDegree[v] == 0) + q.push(v); + } + } + + auto isAcyclic = [](const vector<vector<bool>> &g, int mask, int n) + { + vector<bool> removed(n); + for (int i = 0; i < n; i++) + if (mask & (1 << i)) + removed[i] = true; + + vector<int> deg(n); + for (int u = 0; u < n; u++) + { + if (removed[u]) + continue; + for (int v = 0; v < n; v++) + { + if (!removed[v] && g[u][v]) + deg[v]++; + } + } + + queue<int> q; + int cnt = 0; + int total = n - __builtin_popcount(mask); + for (int i = 0; i < n; i++) + if (!removed[i] && deg[i] == 0) + q.push(i); + + while (!q.empty()) + { + int u = q.front(); + q.pop(); + cnt++; + for (int v = 0; v < n; v++) + { + if (!removed[v] && g[u][v] && --deg[v] == 0) + q.push(v); + } + } + return cnt == total; + }; + + auto findMinFVS = [&](const vector<vector<bool>> &g, int n) + { + set<vector<int>> patterns; + for (int sz = 0; sz <= n; sz++) + { + bool found = false; + for (int mask = 0; mask < (1 << n); mask++) + { + if (__builtin_popcount(mask) != sz) + continue; + if (isAcyclic(g, mask, n)) + { + vector<int> freq(n, 1); + for (int i = 0; i < n; i++) + if (mask & (1 << i)) + freq[i] = 2; + patterns.insert(freq); + found = true; + } + } + if (found) + break; + } + return vector<vector<int>>(patterns.begin(), patterns.end()); + }; + + vector<vector<vector<int>>> sccPatterns(sccTotal); + for (int i = 0; i < sccTotal; i++) + { + auto &group = sccGroups[i]; + if (group.size() == 1) + { + sccPatterns[i] = selfLoop[group[0]] ? vector<vector<int>>{{2}} : vector<vector<int>>{{1}}; + continue; + } + + vector<vector<bool>> subgraph(group.size(), vector<bool>(group.size())); + vector<int> localToGlobal(group.size()); + for (int j = 0; j < group.size(); j++) + { + localToGlobal[j] = group[j]; + if (selfLoop[group[j]]) + subgraph[j][j] = true; + for (int k = 0; k < group.size(); k++) + { + if (graph[group[j]][group[k]]) + subgraph[j][k] = true; + } + } + sccPatterns[i] = findMinFVS(subgraph, group.size()); + } + + vector<vector<int>> result = {{}}; + for (int scc : topoOrder) + { + vector<vector<int>> newResult; + for (auto &freq : result) + { + for (auto &pattern : sccPatterns[scc]) + { + vector<int> newFreq = freq; + newFreq.resize(charCount); + for (int i = 0; i < sccGroups[scc].size(); i++) + { + int globalIdx = sccGroups[scc][i]; + newFreq[globalIdx] = pattern[i]; + } + newResult.push_back(newFreq); + } + } + result = move(newResult); + } + + set<vector<int>> uniqueFreqs; + for (auto &freq : result) + { + vector<int> finalFreq(ALPHA); + for (int i = 0; i < charCount; i++) + finalFreq[chars[i] - 'a'] = freq[i]; + uniqueFreqs.insert(finalFreq); + } + + return vector<vector<int>>(uniqueFreqs.begin(), uniqueFreqs.end()); + } +}; \ No newline at end of file