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;
    }
    

      

  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8797138.html
Copyright © 2011-2022 走看看