先判断是不是环然后记忆化搜索。杜教代码
#include<bits/stdc++.h>
using namespace std;
const int MX=300005;
int f[MX][27];
vector<int>G[MX];
int n,m;
char s[MX];
char vis[MX];
bool dfs(int k){
if(vis[k]==2)return false;
if(vis[k]==1)return true;
vis[k]=1;
for(auto i:G[k])if(dfs(i))return true;
vis[k]=2;
return false;
}
int F(int k,int c){
if(f[k][c]!=-1)return f[k][c];
int r=(s[k]=='a'+c?1:0),a=0;
for(auto i:G[k])a=max(a,F(i,c));
return f[k][c]=r+a;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;cin>>(s+1);
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
G[u].push_back(v);
}
for(int i=1;i<=n;i++)if(!vis[i]&&dfs(i))return cout<<-1<<endl,0;
int ans=0;
memset(f,-1,sizeof(f));
for(int i=1;i<=n;i++)
for(int j=0;j<26;j++)
ans=max(ans,F(i,j));
cout<<ans<<endl;
return 0;
}