1 条题解

  • 0
    @ 2024-9-3 21:16:14
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 3e5 + 5;
    vector<int> g[maxn];
    int n, m, f[maxn][26], in[maxn], ans;
    char s[maxn];
    bool vis[maxn];
    
    bool tp_sort() { // 拓扑排序 没环返回true,有环返回false 
    	queue<int> que;
    	int cnt = 0;
    	for (int i = 1; i <= n; i++)
    		if (!in[i])
    			que.push(i), cnt++;
    	while (!que.empty()) {
    		int u = que.front();
    		que.pop();
    		for (auto v : g[u])
    			if (--in[v] == 0)
    				que.push(v), cnt++;
    	}
    	return cnt == n;
    }
    
    void dfs(int u) {
    	if (vis[u]) // 记忆化 
    		return;
    	vis[u] = true;
    	f[u][s[u] - 'a'] = 1;
    	for (auto v : g[u]) {
    		dfs(v);
    		for (int i = 0; i < 26; i++)
    			f[u][i] = max(f[u][i], f[v][i] + (s[u] == 'a' + i));
    	}
    }
    
    int main() {
    	scanf("%d%d%s", &n, &m, s+1);
    	for (int i = 0; i < m; i++) {
    		int u, v;
    		scanf("%d%d", &u, &v);
    		g[v].push_back(u);
    		in[u]++; // u的入度 
    	}
    	if (!tp_sort()) {
    		puts("-1");
    		return 0;
    	}
    	for (int i = 1; i <= n; i++) {
    		dfs(i);
    		for (int j = 0; j < 26; j++)
    			ans = max(ans, f[i][j]);
    	}
    	printf("%d\n", ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    17
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    12
    已通过
    5
    上传者