Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- using namespace std;
- vector < vector <int>> g(0);
- vector <int> used;
- string s;
- vector<vector<int>> let(0);
- int MAX;
- bool rep;
- void dfs(int v)
- {
- if (rep) return;
- used[v] = 1;
- for (auto u : g[v])
- {
- if (used[u] == 1)
- {
- rep = true;
- return;
- }
- if (used[u] == 2)
- continue;
- dfs(u);
- }
- if (rep) return;
- for( auto u : g[v]){
- for(int i = 0; i < 26; i++)
- let[v][i] = max(let[v][i], let[u][i]);
- }
- let[v][s[v]-'a']++;
- used[v] = 2;
- }
- int main() {
- int n,m; // вершин, ребер
- cin >> n >> m;
- g.resize(n, vector<int>(0));
- used.resize(n, 0);
- let.resize(n, vector<int>(26, 0));
- cin >> s;
- for (int i = 0; i < m; i++)
- {
- int v,u;
- cin >> v >> u;
- v--;
- u--;
- g[v].push_back(u);
- }
- for(int i = 0; i < n; i++)
- if(used[i] == 0 && !rep)
- dfs(i);
- if (rep)
- cout << -1;
- else{
- for(int i = 0; i < n; i++)
- for(int j = 0; j < 26; j++)
- MAX = max(MAX, let[i][j]);
- cout << MAX;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement