zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    Python+fiddler(基于Cookie绕过验证码自动登录)
    Python+selenium(警告框处理)
    Python+selenium(多表单、多窗口切换)
    Python+selenium(定位一组元素)
    Python+selenium登录测试
    【转载】python format遇上花括号{}
    【转载】判断当前使用的编译器及操作系统
    动态库的创建,隐式加载和显式加载
    Google C++单元测试框架GoogleTest---AdvancedGuide(译文)
    三次样条插值 cubic spline interpolation
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8797138.html
Copyright © 2011-2022 走看看