我是靠谱客的博主 单薄皮皮虾,最近开发中收集的这篇文章主要介绍Substring CodeForces - 919D (图上dp),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 3because the letter 'a' appears 3 times.

题意:求含有相同字母最多的路径上这种字母的数量。

思路:如果成环,那么肯定不能计算。

需要计算路径上最多的字母个数,可以考虑分别计算每个字母的最大数量。

想要在图上dp,需要按树上dp的思路,由子节点推父亲节点?那么可以看成是有出度为0点一步步往前推。

所以拓扑排序以后,dp就解决了。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
#include <stack>
typedef long long ll;
#define INF 0x3f3f3f3f
const int maxn=3e5+10;
const int MAXN=1e3+10;
using namespace std;
int n,m;
char s[maxn];
int deg[maxn];
vector<int> vec[maxn];
vector<int> mp;
int dp[maxn];
bool vis[maxn];
bool topSort()
{
stack<int> sta;
for(int i=1;i<=n;i++)
{
if(deg[i]==0)
{
sta.push(i);
}
}
while(sta.empty()==0)
{
int tmp=sta.top();
mp.push_back(tmp);
sta.pop();
for(int j=0;j<vec[tmp].size();j++)
{
if(--deg[vec[tmp][j]]==0)
{
sta.push(vec[tmp][j]);
}
}
}
return mp.size()==n;
}
int dfs(int u)
{
memset(dp,0,sizeof(dp));
char ch=u+'a';
int ans=0;
for(int i=mp.size()-1;i>=0;i--)
{
int tmp=mp[i];
for(int j=0;j<vec[tmp].size();j++)
{
dp[tmp]=max(dp[tmp],dp[vec[tmp][j]]);
}
if(s[tmp-1]==ch)
{
dp[tmp]++;
}
ans=max(ans,dp[tmp]);
}
return ans;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
cin>>n>>m;
memset(deg,0,sizeof(deg));
scanf("%s",s);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
vec[x].push_back(y);
deg[y]++;
}
if(topSort()==0)
{
printf("-1n");
}
else
{
int ans=0;
for(int i=0;i<26;i++)
{
ans=max(ans,dfs(i));
}
printf("%dn",ans);
}
return 0;
}

 

最后

以上就是单薄皮皮虾为你收集整理的Substring CodeForces - 919D (图上dp)的全部内容,希望文章能够帮你解决Substring CodeForces - 919D (图上dp)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部