Submission #1483906


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <cstring>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <unordered_set>
#include <unordered_map>
#include <array>
#include <cassert>
#include <bitset>
using namespace std;
using LL = long long;

namespace scc_space
{
	void dfs(int v_, vector<bool>&used_, vector<int>G_[], vector<int>&vs_)
	{
		used_[v_] = true;
		for (int nxt : G_[v_])
		{
			if (!used_[nxt])dfs(nxt, used_, G_, vs_);
		}
		vs_.push_back(v_);
	}

	void rdfs(int v_, int k_, vector<bool>&used_, vector<vector<int>>&rG_, vector<int>&top)
	{
		used_[v_] = true;
		top[v_] = k_;
		for (int nxt : rG_[v_])
		{
			if (!used_[nxt])rdfs(nxt, k_, used_, rG_, top);
		}
	}
}

//頂点数n_のグラフG_の強連結成分分解をする
//topに強連結成分のトポロジカル順序が格納される
//(top[i]==top[j]のとき、iとjは強連結である。)
//戻り値:強連結成分の個数
int scc(vector<int>G_[], int n_, vector<int>&top)
{
	using namespace scc_space;
	top.resize(n_);
	vector<vector<int>>rG_(n_);
	for (int i = 0; i < n_; ++i)
	{
		for (int to : G_[i])
		{
			rG_[to].push_back(i);
		}
	}
	vector<bool>used(n_, false);
	vector<int>vs;
	for (int v = 0; v < n_; ++v)
	{
		if (!used[v])dfs(v, used, G_, vs);
	}
	fill(used.begin(), used.end(), false);
	int k = 0;
	for (int i = vs.size() - 1; i >= 0; --i)
	{
		if (!used[vs[i]])rdfs(vs[i], k++, used, rG_, top);
	}
	return k;
}


int n, m, k;
char c[300];
vector<int>graph[300];
vector<int>top;
map<int, string>vert;//頂点の文字集合
vector<int>press[300];//強連結をつぶした後のDAG
vector<int>prinv[300];//pressの逆グラフ
set<int>prraw[300];

//強連結iにいて、文字列の長さがjの時の文字列
string memo[345][345];
bool izryt[345][345];
const string& dp(int i, int j)
{
	if (izryt[i][j])return memo[i][j];
	string res(j, '~');
	if (prinv[i].empty())
	{
		res = vert[i];
		res.resize(j, '~');
	}
	else
	{
		for (int las : prinv[i])
		{
			for (int k = 0; k <= j; ++k)
			{
				string S = dp(las, j - k) + vert[i];
				if (S.size() < j)continue;
				S.resize(j);
				res = min(res, S);
			}
		}
	}
	memo[i][j] = res;
	izryt[i][j] = true;
	return memo[i][j];
}

int main(void)
{
	cin >> n >> m >> k;
	for (int i = 0; i < n; ++i)
		cin >> c[i];
	for (int i = 0; i < m; ++i)
	{
		int a, b;
		cin >> a >> b;
		--a; --b;
		graph[a].push_back(b);
	}
	scc(graph, n, top);
	for (int i = 0; i < n; ++i)
	{
		vert[top[i]].push_back(c[i]);
	}
	for (auto &p : vert)
	{
		sort(p.second.begin(), p.second.end());
	}
	for (int i = 0; i < n; ++i)
	{
		set<int>s;
		for (int to : graph[i])
		{
			s.insert(top[to]);
		}
		for (int to : s)
		{
			if (to == top[i])continue;
			prraw[top[i]].insert(to);
		}
	}
	for (int i = 0; i < n; ++i)
	{
		for (auto p : prraw[i])
		{
			press[i].push_back(p);
			prinv[p].push_back(i);
		}
	}
	string ans(k, '~');
	for (int i = 0; i < n; ++i)
	{
		string can = dp(i, k);
		ans = min(ans, can);
	}
	if (ans.find('~') != string::npos)
	{
		cout << "-1\n";
	}
	else
	{
		cout << ans << endl;
	}
	return 0;
}

Submission Info

Submission Time
Task C - 有向グラフ
User platypus
Language C++14 (GCC 5.4.1)
Score 100
Code Size 3495 Byte
Status AC
Exec Time 1235 ms
Memory 24448 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 4
AC × 32
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt
All subtask0_sample_01.txt, subtask0_sample_02.txt, subtask0_sample_03.txt, subtask0_sample_04.txt, subtask1_manual01.txt, subtask1_manual02.txt, subtask1_manual03.txt, subtask1_manual04.txt, subtask1_manual05.txt, subtask1_manual06.txt, subtask1_manual07.txt, subtask1_manual08.txt, subtask1_random01.txt, subtask1_random02.txt, subtask1_random03.txt, subtask1_random04.txt, subtask1_random05.txt, subtask1_special01.txt, subtask1_special02.txt, subtask1_special03.txt, subtask1_special04.txt, subtask1_special05.txt, subtask1_special06.txt, subtask1_special07.txt, subtask1_special08.txt, subtask1_special09.txt, subtask1_special10.txt, subtask1_special11.txt, subtask1_special12.txt, subtask1_special13.txt, subtask1_special14.txt, subtask1_special15.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 2 ms 1152 KB
subtask0_sample_02.txt AC 2 ms 1280 KB
subtask0_sample_03.txt AC 2 ms 1152 KB
subtask0_sample_04.txt AC 2 ms 1152 KB
subtask1_manual01.txt AC 2 ms 1152 KB
subtask1_manual02.txt AC 2 ms 1280 KB
subtask1_manual03.txt AC 2 ms 1280 KB
subtask1_manual04.txt AC 2 ms 1152 KB
subtask1_manual05.txt AC 2 ms 1152 KB
subtask1_manual06.txt AC 2 ms 1152 KB
subtask1_manual07.txt AC 2 ms 1280 KB
subtask1_manual08.txt AC 2 ms 1280 KB
subtask1_random01.txt AC 20 ms 1664 KB
subtask1_random02.txt AC 5 ms 1408 KB
subtask1_random03.txt AC 47 ms 2048 KB
subtask1_random04.txt AC 16 ms 1664 KB
subtask1_random05.txt AC 3 ms 1408 KB
subtask1_special01.txt AC 2 ms 1408 KB
subtask1_special02.txt AC 4 ms 1536 KB
subtask1_special03.txt AC 126 ms 4736 KB
subtask1_special04.txt AC 523 ms 12544 KB
subtask1_special05.txt AC 1235 ms 24448 KB
subtask1_special06.txt AC 423 ms 8960 KB
subtask1_special07.txt AC 98 ms 3584 KB
subtask1_special08.txt AC 406 ms 8960 KB
subtask1_special09.txt AC 402 ms 8960 KB
subtask1_special10.txt AC 399 ms 8832 KB
subtask1_special11.txt AC 287 ms 7040 KB
subtask1_special12.txt AC 232 ms 5760 KB
subtask1_special13.txt AC 188 ms 4992 KB
subtask1_special14.txt AC 2 ms 1408 KB
subtask1_special15.txt AC 1202 ms 22528 KB