1. 程式人生 > 其它 >CF Round#460 D - Substring

CF Round#460 D - Substring

D - Substring

拓撲排序

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
typedef long long ll;
const int N = 3e5 + 10;
int n, m;
string s;
vector<int> G[N];
int f[N][26];
int din[N];
void add(int a, int b)
{
	G[a].push_back(b);
	din[b]++;
}

int topsort()
{
	queue<int> q;
	for (int i = 1; i <= n; i++)
	{
		if (!din[i])
		{
			q.push(i);
			f[i][s[i] - 'a'] = 1;
		}
	}
		
	int cnt = 0;
	while(!q.empty())
	{
		int u = q.front();
		cnt++;
		q.pop();
		for (int v : G[u])
		{
			din[v]--;
			int t = s[v] - 'a';
			for (int i = 0; i < 26; i++)
				f[v][i] = max(f[v][i], f[u][i]);
			f[v][t] = max(f[v][t], f[u][t] + 1);
			if (!din[v])
				q.push(v);
		}
	}
	if (cnt != n)
		return -1;
	int maxn = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 0; j < 26; j++)
			maxn = max(maxn, f[i][j]);
	return maxn;
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> s;
	s = " " + s;
	while(m--)
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
	}
	
	cout << topsort() << endl;
	return 0;
}