• Codeforces Round #460 (Div. 2) D Substring


    You are given a graph with n nodes and m directed edges. One lowercase letter is assigned to each node. We define a path's value as the number of the most frequently occurring letter. For example, if letters on a path are "abaca", then the value of that path is 3. Your task is find a path whose value is the largest.

    Input

    The first line contains two positive integers n, m (1 ≤ n, m ≤ 300 000), denoting that the graph has n nodes and m directed edges.

    The second line contains a string s with only lowercase English letters. The i-th character is the letter assigned to the i-th node.

    Then m lines follow. Each line contains two integers x, y (1 ≤ x, y ≤ n), describing a directed edge from x to y. Note that x can be equal to y and there can be multiple edges between x and y. Also the graph can be not connected.

    Output

    Output a single line with a single integer denoting the largest value. If the value can be arbitrarily large, output -1 instead.

    Examples
    input
    5 4
    abaca
    1 2
    1 3
    3 4
    4 5
    output
    3
    input
    6 6
    xzyabc
    1 2
    3 1
    2 3
    5 4
    4 3
    6 4
    output
    -1
    input
    10 14
    xzyzyzyzqx
    1 2
    2 4
    3 5
    4 5
    2 6
    6 8
    6 5
    2 10
    3 9
    10 9
    4 6
    1 10
    2 8
    3 7
    output
    4
    Note

    In the first sample, the path with largest value is 1 → 3 → 4 → 5. The value is 3 because the letter 'a' appears 3 times.

    有n个节点和m条边,图是有向的,每个节点有一个小写字符,求一条路径中出现相同字符最大的数量。

    dfs+dp问题,dp[i][j]表示以i节点开始的路径中字母'a'+j出现的最大次数。然后j遍历0-26,就可以求出最大值了。

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 3e5+10;
    char str[N];
    int n, m, x, y, ans;
    vector<int> vs[N];
    int vis[N];
    int dp[N][26];
    
    void dfs(int u) {
    	vis[u] = 1;
    	dp[u][str[u]-'a'] = 1;
    	for(int i = 0; i < vs[u].size(); i ++) {
    		int v = vs[u][i];
    		if(vis[v] == 1) {
    			printf("-1
    ");
    			exit(0);
    		} else{
    			if(!vis[v]) dfs(v);
    			for(int j = 0; j < 26; j ++) {
    				dp[u][j] = max(dp[u][j],dp[v][j]+(str[u]-'a' == j));
    			}
    		}
    	}
    	vis[u] = 2;
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin >> n >> m;
    	cin >> str+1;
    	for(int i = 0; i < m; i ++) {
    		cin >> x >> y;
    		vs[x].push_back(y);
    	}
    	memset(vis,0,sizeof(vis));
    	memset(dp,0,sizeof(dp));
    	for(int i = 1; i <= n; i ++) {
    		if(!vis[i]) {
    			dfs(i);
    			for(int j = 0; j < 26; j ++) {
    				ans = max(ans,dp[i][j]);
    			}
    		}
    	}
    	cout << ans << endl;
    	return 0;
    }
    

      

  • 相关阅读:
    补习系列(4)-springboot 参数校验详解
    华为鲁勇:5G+云+AI三大核心引擎将驱动广州数字经济发展
    selenium firefox
    徐翔之后新生代“敢死队”浮出水面:八年一万倍
    ActiveMQ讯息传送机制以及ACK机制
    一元线性回归分析及java实现
    jsoup -- xml文档解析
    HDU 1020 Encoding 字符串
    PHP缓存之文件缓存
    Eclipse PHPEclipse 配置
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8797138.html
Copyright © 2020-2023  润新知