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.
输入输出样例
说明
In the first sample, the path with largest value is 1→3→4→51→3→4→5 . 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\n",ans); return 0; }