Advertisement
Ne-Biolog

Untitled

Feb 2nd, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define DEBUG 0
  6. #define TIME clock() / 1.0 / CLOCKS_PER_SEC
  7.  
  8. const int maxN = (int)3e5 + 17;
  9.  
  10. int n, m;
  11. int a[maxN];
  12. int used[maxN];
  13. vector <int> dd;
  14. int dp[maxN][26];
  15. vector <int> g[maxN];
  16.  
  17. void TopSort(int v) {
  18. used[v] = 1;
  19. //cout << "- >" << v + 1 << ' ';
  20. for(const auto to : g[v]) {
  21. if(used[to] == 1) {
  22. cout << -1 << '\n';
  23. exit(0);
  24. } else if(used[to] == 0) {
  25. TopSort(to);
  26. }
  27. }
  28. used[v] = 2;
  29. dd.push_back(v);
  30. }
  31.  
  32. void dfs(int v, int colour) {
  33. used[v] = 1;
  34. if(g[v].size() == 0) {
  35. dp[v][colour] = (colour == a[v]);
  36. }
  37. for(const auto to : g[v]) {
  38. if(!used[to]) {
  39. dfs(to, colour);
  40. }
  41. dp[v][colour] = max(dp[v][colour], dp[to][colour] + (colour == a[to]));
  42. }
  43. }
  44.  
  45. int solve(int v) {
  46. int ret = 0;
  47. for(int i = 0; i < dd.size(); ++i) {
  48. if(!used[dd[i]])
  49. dfs(dd[i], v);
  50. }
  51. fill(used, used + maxN, 0);
  52. for(int i = 0; i < n; ++i) {
  53. ret = max(ret, dp[i][v]);
  54. }
  55. return ret;
  56. }
  57.  
  58. signed main()
  59. {
  60. #if DEBUG
  61. freopen("input.txt", "r", stdin);
  62. freopen("output.txt" , "w", stdout);
  63. #endif
  64.  
  65. cin >> n >> m;
  66. for(int i = 0; i < n; ++i) {
  67. char x; cin >> x;
  68. a[i] = x - 'a';
  69. }
  70. for(int i = 0; i < m; ++i) {
  71. int x, y;
  72. cin >> x >> y;
  73. g[x - 1].push_back(y - 1);
  74. }
  75. for(int i = 0; i < n; ++i) {
  76. if(!used[i])
  77. TopSort(i);
  78. }
  79. //reverse(dd.begin(), dd.end());
  80. fill(used, used + maxN, 0);
  81. for(const auto i : dd){
  82. cout << i + 1 << ' ';
  83. }
  84. cout << endl;
  85.  
  86. int ans = 0;
  87. for(int i = 'a'; i <= 'z'; ++i){
  88. ans = max(ans, solve(i - 'a'));
  89. }
  90.  
  91. cout << ans << '\n';
  92.  
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement