Algorithm


C. LionAge II
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Vasya plays the LionAge II. He was bored of playing with a stupid computer, so he installed this popular MMORPG, to fight with his friends. Vasya came up with the name of his character — non-empty string s, consisting of a lowercase Latin letters. However, in order not to put up a front of friends, Vasya has decided to change no more than k letters of the character name so that the new name sounded as good as possible. Euphony of the line is defined as follows: for each pair of adjacent letters x and y (x immediately precedes y) the bonus c(x, y) is added to the result. Your task is to determine what the greatest Euphony can be obtained by changing at most k letters in the name of the Vasya's character.

Input

The first line contains character's name s and an integer number k (0 ≤ k ≤ 100). The length of the nonempty string s does not exceed 100. The second line contains an integer number n (0 ≤ n ≤ 676) — amount of pairs of letters, giving bonus to the euphony. The next n lines contain description of these pairs «x y c», which means that sequence xy gives bonus c (x, y — lowercase Latin letters,  - 1000 ≤ c ≤ 1000). It is guaranteed that no pair x y mentioned twice in the input data.

Output

Output the only number — maximum possible euphony оf the new character's name.

Examples
input
Copy
winner 4
4
s e 7
o s 8
l o 13
o o 8
output
Copy
36
input
Copy
abcdef 1
5
a b -10
b c 5
c d 5
d e 5
e f 5
output
Copy
20
Note

In the first example the most euphony name will be looser. It is easy to calculate that its euphony is 36.



 

Code Examples

#1 Code Example with C++ Programming

Code - C++ Programming

#include <bits/stdc++.h>

using namespace std;

string s;
int k, n, bn[27][27], dp[101][27][101];

int rec(int idx, int prv, int cur) {
	if(idx == s.length())
		return 0;

	int &ret = dp[idx][prv][cur];
	if(ret != -1e9)
		return ret;

	ret = max(ret, rec(idx + 1, s[idx] - 'a', cur) + bn[prv][s[idx] - 'a']);
	for(int i = 0; cur < k && i < 26; ++i)
		ret = max(ret, rec(idx + 1, i, cur + 1) + bn[prv][i]);

	return ret;
}

void build_path(int idx, int prv, int cur) {
	if(idx == s.length())
		return;

	int opt = rec(idx, prv, cur);

	if(opt == rec(idx + 1, s[idx] - 'a', cur) + bn[prv][s[idx] - 'a']) {
		cout << s[idx];
		build_path(idx + 1, s[idx] - 'a', cur);
		return;
	}

	for(int i = 0; cur < k && i < 26; ++i) {
		if(opt == rec(idx + 1, i, cur + 1) + bn[prv][i]) {
			cout << char(i + 'a');
			build_path(idx + 1, i, cur + 1);
			return;
		}
	}
}

int main() {
	cin >> s >> k;
	cin >> n;
	
	for(int i = 0; i < n; ++i) {
		char a, b;
		int c;
		cin >> a >> b >> c;
		bn[a - 'a'][b -'a'] = c;
	}

	for(int i = 0; i < 101; ++i)
		for(int j = 0; j < 27; ++j)
			for(int k = 0; k < 101; ++k)
				dp[i][j][k] = -1e9;
	cout << rec(0, 26, 0) << endl;

	return 0;
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
winner 4
4
s e 7
o s 8
l o 13
o o 8

Output

x
+
cmd
36
Advertisements

Demonstration


Codeforcess Solution LionAge II, C. LionAge II C,C++, Java, Js and Python ,C. LionAge II,Codeforcess Solution

Previous
Codeforces solution 1080-B-B. Margarite and the best present codeforces solution
Next
CodeChef solution DETSCORE - Determine the Score CodeChef solution C,C+