题目链接
思路:要你一条链上的最多的字母树可以设dp【i】【j】表示i这个点的第j个字母的个数是多少,至于拓扑排序的话只是用来按顺序遍历的,你用dfs也可以的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=3e5+1;
vector<int>g[maxn];
char s[maxn];
int u,v,n,m,cnt=0,maxx=0,ru[maxn],dp[maxn][27];
bool tuopu()
{
memset(dp,0,sizeof(dp));
queue<int>q;
for(int i=1;i<=n;++i) if(ru[i]==0) q.push(i);
for(int i=1;i<=n;++i) dp[i][s[i-1]-'a']=1;
while(!q.empty())
{
int t=q.front();
q.pop();
cnt++;
for(int to:g[t])
{
ru[to]--;
for(int i=0;i<26;++i)
dp[to][i]=max(dp[to][i],dp[t][i]+((i==(s[to-1]-'a'))));
if(ru[to]==0) q.push(to);
}
}
return cnt>=n;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s);
for(int i=1;i<=m;++i)
{
scanf("%d%d",&u,&v);
g[u].push_back(v);
ru[v]++;
}
if(!tuopu()) {printf("-1\n");return 0;}
for(int i=1;i<=n;++i)
for(int j=0;j<26;++j)
maxx=max(maxx,dp[i][j]);
printf("%d\n",maxx);
}