Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- template <class T>
- void read(T &x)
- {
- x = 0;
- register int c;
- while ((c = getchar()) && (c > '9' || c < '0'))
- ;
- for (; c >= '0' && c <= '9'; c = getchar())
- x = x * 10 + c - '0';
- }
- constexpr bool typetest = 0;
- constexpr int N = 1e5 + 5;
- int n, m, l(0), com[N];
- bool ck[N];
- string s;
- int x[N];
- vector<int> adj[N], nadj[N], ss;
- void Read()
- {
- cin >> n >> m >> s;
- s = " " + s;
- for (int i = 1; i <= m; ++i)
- {
- int u, v;
- cin >> u >> v;
- adj[u].emplace_back(v);
- nadj[v].emplace_back(u);
- }
- }
- void dfs(int v)
- {
- ck[v] = 1;
- for (auto i : adj[v])
- if (!ck[i])
- dfs(i);
- ss.emplace_back(v);
- }
- void dfs_com(int v)
- {
- com[v] = l;
- for (auto i : nadj[v])
- if (!com[i])
- dfs_com(i);
- }
- void Kosaraju()
- {
- for (int i = 1; i <= n; ++i)
- if (!ck[i])
- dfs(i);
- while (!ss.empty())
- {
- int c = ss.back();
- ss.pop_back();
- if (com[c])
- {
- cout << -1;
- exit(0);
- }
- ++l;
- dfs_com(c);
- }
- }
- int Cal(int v)
- {
- queue<int> q[2];
- for (int i = 1; i <= n; ++i)
- if ((x[i] = nadj[i].size()) == 0)
- {
- if (s[i] == 'C')
- q[v].emplace(i);
- else
- q[s[i] - 'A'].emplace(i);
- }
- int ans(0);
- for (int turn = v; !q[turn].empty(); turn ^= 1)
- {
- ++ans;
- while (!q[turn].empty())
- {
- int c = q[turn].front();
- q[turn].pop();
- for (auto i : adj[c])
- {
- --x[i];
- if (x[i] == 0)
- {
- if (s[i] == 'C')
- q[turn].emplace(i);
- else
- q[s[i] - 'A'].emplace(i);
- }
- }
- }
- }
- return ans - 1;
- }
- void Solve()
- {
- Kosaraju();
- cout << Cal(0);
- }
- int32_t main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t(1);
- if (typetest)
- cin >> t;
- for (int _ = 1; _ <= t; ++_)
- {
- //cout << "Case #" << _ << "\n";
- Read();
- Solve();
- }
- }
Add Comment
Please, Sign In to add comment