思路:
定义状态dp[i][j]表示在 i 点,j出现的最大次数,利用拓扑排序更新状态
定义状态dp[i][j]表示在 i 点,j出现的最大次数,利用拓扑排序更新状态
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 300005;
int n, m;
char s[maxn];
vector<int> edges[maxn];
int ans;
int dp[maxn][26];
int q[maxn], front, rear;
int deg[maxn];
bool topo_sort() {
rear = front = 0;
int cnt = 0;
for(int i = 1; i <= n; ++i) {
if(deg[i] == 0) {
q[rear++] = i;
dp[i][s[i] - 'a'] = 1;
}
}
while(front != rear) {
int u = q[front++];
cnt++;
for(int i = 0; i < edges[u].size(); ++i) {
int v = edges[u][i];
for(int j = 0; j < 26; ++j) {
dp[v][j] = max(dp[u][j] + (int)(j == (int)(s[v] - 'a')), dp[v][j]);
}
if((--deg[v]) == 0) q[rear++] = v;
}
}
for(int i = 1; i <= n; ++i)
for(int j = 0; j < 26; ++j)
ans = max(ans, dp[i][j]);
return cnt == n;
}
int main() {
cin >> n >> m;
scanf("%s", s + 1);
for(int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
edges[u].push_back(v);
deg[v]++;
}
ans = -1;
if(topo_sort()) cout << ans << endl;
else cout << -1 << endl;
return 0;
}