Submission #1454430
Source Code Expand
#include<iostream> #include<fstream> #include<stdio.h> #include<string> #include<vector> #include<map> #include<math.h> #include<algorithm> #include<iomanip> #include<set> #define P 1000000007 using namespace std; int k; class Node { public: int now; string s; Node(int n, string str) { now = n; s = str; } bool operator>(const Node &rhs) const { return this->s > rhs.s; } bool operator<(const Node &rhs) const { return this->s < rhs.s; } }; class G { public: vector<vector<int>> p, inv, sp, sinv; int n, m, l; vector<string> word; vector<int> b, c, depth; vector<bool> a; G(int nn, vector<vector<int>> &np, vector<vector<int>> &ninv) { n = nn; p = np; inv = ninv; a.resize(n); c.resize(n); for(int i = 0; i < n; i++) { c[i] = -1; } l = 0; } void dfs(int i) { if(a[i]) return; // cout << i << " " << inv[i].size() << " " << p[i].size() << endl; a[i] = true; for(int j = 0; j < p[i].size(); j++) { if(a[p[i][j]]) { continue; } dfs(p[i][j]); } b.push_back(i); } void dfs2(int i, int id) { if(c[i] > -1) return; c[i] = id; l++; for(int j = 0; j < inv[i].size(); j++) { if(c[inv[i][j]] > -1) continue; dfs2(inv[i][j], id); } } void solve() { for(int i = 0; i < n; i++) { dfs(i); } int j = 0; // for(int i = 0; i < n; i++) cout << b[i] << endl; for(int i = n - 1; i >= 0; i--) { if(c[b[i]] > 0) continue; dfs2(b[i], j++); } m = j; sp.resize(m); sinv.resize(m); for(int i = 0; i < n; i++) { for(int j = 0; j < p[i].size(); j++) { if(c[i] == c[p[i][j]]) continue; sp[c[i]].push_back(c[p[i][j]]); sinv[c[p[i][j]]].push_back(c[i]); } } } int dfs3(int i) { if(depth[i] > 0) return depth[i]; int dep = 0; for(int j = 0; j < sp[i].size(); j++) { dep = max(dep, dfs3(sp[i][j])); } depth[i] = dep + word[i].size(); return depth[i]; } void solve2(vector<char> d) { word.resize(m); for(int i = 0; i < n; i++) { word[c[i]].push_back(d[i]); } for(int i = 0; i < m; i++) { sort(word[i].begin(), word[i].end()); } depth.resize(m); for(int i = 0; i < m; i++) { dfs3(i); } string s = ""; multiset<Node> q; for(int i = 0; i < m; i++) { if(sinv[i].size() == 0) { for(int j = word[i].size(); j >= 0 && depth[i] - word[i].size() + j >= k; j--) { q.insert(Node(i, word[i].substr(0, j))); } } } while(q.size() > 0) { Node now = *q.begin(); q.erase(q.begin()); // cout << now.s << endl; if(now.s.size() == k) { cout << now.s << endl; return; } for(int i = 0; i < sp[now.now].size(); i++) { for(int j = word[sp[now.now][i]].size(); j >= 0 && now.s.size() + depth[sp[now.now][i]] - word[sp[now.now][i]].size() + j >= k; j--) { q.insert(Node(sp[now.now][i], now.s + word[sp[now.now][i]].substr(0, j))); } } } cout << -1 << endl; return; } }; int main() { vector<vector<int>> path, inv; int n, m; cin >> n >> m >> k; path.resize(n); inv.resize(n); vector<char> c; c.resize(n); for(int i = 0; i < n; i++) cin >> c[i]; for(int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; path[a].push_back(b); inv[b].push_back(a); } G graph(n, path, inv); graph.solve(); graph.solve2(c); return 0; }
Submission Info
Submission Time | |
---|---|
Task | C - 有向グラフ |
User | ninja7 |
Language | C++14 (GCC 5.4.1) |
Score | 0 |
Code Size | 3696 Byte |
Status | TLE |
Exec Time | 2122 ms |
Memory | 317312 KB |
Judge Result
Set Name | Sample | All | ||||||
---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 0 / 100 | ||||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt |
All | subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt, subtask1_manual01.txt, subtask1_manual02.txt, subtask1_manual03.txt, subtask1_manual04.txt, subtask1_manual05.txt, subtask1_manual06.txt, subtask1_manual07.txt, subtask1_manual08.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_special01.txt, subtask1_special02.txt, subtask1_special03.txt, subtask1_special04.txt, subtask1_special05.txt, subtask1_special06.txt, subtask1_special07.txt, subtask1_special08.txt, subtask1_special09.txt, subtask1_special10.txt, subtask1_special11.txt, subtask1_special12.txt, subtask1_special13.txt, subtask1_special14.txt, subtask1_special15.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
subtask0_sample_01.txt | AC | 1 ms | 256 KB |
subtask0_sample_02.txt | AC | 1 ms | 256 KB |
subtask0_sample_03.txt | AC | 1 ms | 256 KB |
subtask0_sample_04.txt | AC | 1 ms | 256 KB |
subtask1_manual01.txt | AC | 1 ms | 256 KB |
subtask1_manual02.txt | AC | 1 ms | 256 KB |
subtask1_manual03.txt | AC | 1 ms | 256 KB |
subtask1_manual04.txt | AC | 1 ms | 256 KB |
subtask1_manual05.txt | AC | 1 ms | 256 KB |
subtask1_manual06.txt | AC | 1 ms | 256 KB |
subtask1_manual07.txt | AC | 1 ms | 256 KB |
subtask1_manual08.txt | AC | 1 ms | 256 KB |
subtask1_random01.txt | AC | 5 ms | 2048 KB |
subtask1_random02.txt | AC | 8 ms | 3072 KB |
subtask1_random03.txt | AC | 2 ms | 640 KB |
subtask1_random04.txt | AC | 3 ms | 1024 KB |
subtask1_random05.txt | AC | 9 ms | 3328 KB |
subtask1_special01.txt | AC | 1 ms | 384 KB |
subtask1_special02.txt | AC | 861 ms | 90496 KB |
subtask1_special03.txt | AC | 2 ms | 384 KB |
subtask1_special04.txt | AC | 2 ms | 384 KB |
subtask1_special05.txt | AC | 2 ms | 384 KB |
subtask1_special06.txt | AC | 2 ms | 384 KB |
subtask1_special07.txt | TLE | 2122 ms | 317312 KB |
subtask1_special08.txt | AC | 2 ms | 384 KB |
subtask1_special09.txt | AC | 2 ms | 384 KB |
subtask1_special10.txt | AC | 2 ms | 384 KB |
subtask1_special11.txt | AC | 2 ms | 384 KB |
subtask1_special12.txt | AC | 2 ms | 384 KB |
subtask1_special13.txt | AC | 2 ms | 384 KB |
subtask1_special14.txt | AC | 1 ms | 384 KB |
subtask1_special15.txt | AC | 2 ms | 384 KB |