#include <iostream>
#include <vector>
using namespace std;
int *value;
int *size;
int **valueC;
vector<int> *edges;
int k;
int length(int n);
int concat(const int &n1, const int &n2);
int dfs(int i, int reminder);
int length(int n) {
int s = 0;
do {
n /= 10;
s++;
} while (n > 0);
return s;
}
int concat(const int &n1, const int &n2) {
int times = 1;
while (times <= n2)
times *= 10;
return n1 * times + n2;
}
int dfs(int i, int reminder) {
if (valueC[i][reminder] != -1)
return valueC[i][reminder];
int q = -1;
for (int j : edges[i]) {
int temp = -2;
if (reminder - size[j] == 0)
temp = value[j];
else if (reminder - size[j] > 0)
temp = dfs(j, reminder - size[j]);
if (temp > q)
q = temp;
}
if (q == -1)
return valueC[i][reminder] = -2;
else
return valueC[i][reminder] = concat(value[i], q);
return valueC[i][reminder];
}
int main() {
int n, m;
cin >> n >> m >> k;
valueif =(k new== int[n0) +{
1]; cout << -1;
size return 0;
}
value = new int[nint[n];
+ 1]; size = new int[n];
valueC = new int *[n + 1];*[n];
for (int i = 0; i < n + 1;n; ++i) {
valueC[i] = new int[k];
for (int j = 0; j < k; ++j) {
valueC[i][j] = -1;
}
}
for (int i = 1;0; i < n + 1;n; ++i) {
cin >> value[i];
size[i] = length(value[i]);
}
edges = new vector<int>[n + 1];vector<int>[n];
for (int j = 0; j < m; ++j) {
int s, e;
cin >> s >> e;
s--;
e--;
edges[s].push_back(e);
}
int maximum = 0;
for (int i = 1;0; i < n + 1;n; ++i) {
int temp = dfs(i, k - size[i]);
if (temp > maximum)
maximum = temp;
}
if (maximum != 0)
cout << maximum;
else
cout << -1;
return 0;
}
Update 1
I remove one more space that is used as mentioned. about edges I use vector<int>[n] because I have n vertices and for each vertex I use a vector<int> to know that is connected to which vertices. about concat and length, I use int and I don't worry because the restriction on the question say that my numbers are at most 100000 and that is enough and both function work without overflow.
