有环就输出-1。
剩下的暴力dp,如果dp[i][j]是由父亲状态转移过来的,那么dp[i][j]++
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=3e5+10;
char str[maxn];
struct node
{
int v,nxt;
}e[maxn<<1];
int head[maxn],cnt;
int n,du[maxn],dp[maxn][30];
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
queue<int>q;
void solve()
{
for(int i=1;i<=n;i++)
{
if(!du[i])q.push(i),dp[i][str[i]-'a']=1;
}
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
for(int j=0;j<26;j++)dp[v][j]=max(dp[u][j],dp[v][j]);
int tmp=str[v]-'a';
if(dp[u][tmp]==dp[v][tmp])dp[v][tmp]++;
du[v]--;
if(!du[v])q.push(v);
}
}
for(int i=1;i<=n;i++)
{
if(du[i])
{
cout<<"-1"<<endl;
return;
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)ans=max(ans,dp[i][j]);
}
cout<<ans<<endl;
return;
}
int main()
{
int m;
scanf("%d%d",&n,&m);
scanf("%s",str+1);
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
add(u,v);
du[v]++;
}
solve();
return 0;
}