zoukankan      html  css  js  c++  java
  • Codeforces 919 D Substring

    题目描述

    You are given a graph with nn nodes and mm 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 33 . Your task is find a path whose value is the largest.

    输入输出格式

    输入格式:

    The first line contains two positive integers n,mn,m ( 1<=n,m<=3000001<=n,m<=300000 ), denoting that the graph has nn nodes and mmdirected edges.

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

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    5 4
    abaca
    1 2
    1 3
    3 4
    4 5
    
    输出样例#1: 
    3
    
    输入样例#2: 
    6 6
    xzyabc
    1 2
    3 1
    2 3
    5 4
    4 3
    6 4
    
    输出样例#2: 
    -1
    
    输入样例#3: 
    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
    
    输出样例#3: 
    4
    

    说明

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

    XJB DP就行了,之前判一下是不是DAG

    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #define ll long long
    #define maxn 300005
    using namespace std;
    int ans=0,g[maxn];
    int n,m,id[maxn],u,v;
    int f[maxn],hd[maxn];
    int to[maxn],ne[maxn];
    bool vis[maxn];
    char s[maxn];
    
    inline int num(char x){
    	return x-'a';
    }
    
    inline bool topsort(){
    	queue<int> q;
    	int x,tot=0;
    	
    	for(int i=1;i<=n;i++) if(!id[i]) q.push(i);
    	
    	while(!q.empty()){
    		x=q.front(),q.pop(),tot++;
    		for(int i=hd[x];i;i=ne[i]) if(!(--id[to[i]]))
    		    q.push(to[i]);
    	}
    	
    	return tot==n;
    }
    
    
    int dp(int x){
    	if(vis[x]) return g[x];
    	vis[x]=1,g[x]=0;
    	for(int i=hd[x];i;i=ne[i]) g[x]=max(g[x],dp(to[i]));
    	g[x]+=f[x];
    	return g[x];
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	scanf("%s",s+1);
    	for(int i=1;i<=m;i++){
    		scanf("%d%d",&u,&v);
    		to[i]=v,ne[i]=hd[u];
    		hd[u]=i,id[v]++;
    	}
    	
    	if(!topsort()){
    		puts("-1");
    		return 0;
    	}
    	
    	for(int i=0;i<26;i++){
    		memset(vis,0,sizeof(vis));
    		for(int j=1;j<=n;j++) f[j]=(num(s[j])==i);
    		
    		for(int j=1;j<=n;j++) ans=max(ans,dp(j));
    	}
    	
    	printf("%d
    ",ans);
    	return 0;
    	
    }
    

      

  • 相关阅读:
    一、单一职责原则
    四、接口隔离原则
    彼得·林奇的25条黄金规则
    程序员的四个境界
    VS2008开发.NET 2.0的项目时,可用的C#3.0语言特性一览表
    Linq试用问题总结
    SQL Server 2000中修改数据库COLLATE一例
    SQL Tip:将SP生成的结果集Insert到另一Table中
    OOAD读书笔记(一):什么是好的软件?
    成功创业的8个关键点
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8474694.html
Copyright © 2011-2022 走看看