#include #include #include #include using namespace std; #define MAX_N 220000 #define INPUT_FILE "fixdna.in" #define OUTPUT_FILE "fixdna.out" int n, k, t; char original[MAX_N]; char output[MAX_N]; int distances[50][50]; class XX { public: int index; int weight; XX() { index = 0; weight = 0; } XX(int _index, int _weight) { index = _index; weight = _weight; } bool operator < (const XX &a) const { if (weight == a.weight) { return index < a.index; } return weight > a.weight; } }; void readInput() { FILE *f = fopen(INPUT_FILE, "r"); fscanf(f, "%d%d%d", &n, &k, &t); fscanf(f, "%s", original); fscanf(f, "%s", output); for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { fscanf(f, "%d", &distances[i][j]); } } fclose(f); } int charDistance(char a, char b) { return distances[a - 'a'][b - 'a']; } int distance(int n, char *original, char *test) { int d = 0; for (int i = 0; i < n; i++) { d += charDistance(original[i], test[i]); } return d; } vector tt; void solve() { //printf("n = %d\n", n); //printf("k = %d\n", k); //printf("t = %d\n", t); //printf("original = %s\n", original); //printf("output = %s\n", output); int dst = distance(n, output, original); //printf("distance = %d\n", dst); tt.clear(); for (int i = 0; i < n; i++) { //printf("%c %c -> %d\n", original[i], output[i], charDistance(original[i], output[i])); if (charDistance(original[i], output[i]) > 0) { tt.push_back(XX(i, charDistance(original[i], output[i]))); } } sort(tt.begin(), tt.end()); for (int i = 0; i < tt.size(); i++) { //printf("%d %d\n", tt[i].index, tt[i].weight); } } void writeOutput() { FILE *f = fopen(OUTPUT_FILE, "w"); int ttt = tt.size(); int kk = min(t / 2, ttt); fprintf(f, "%d\n", 2 * kk); for (int i = 0; i < kk; i++) { fprintf(f, "3 %d\n", tt[i].index); fprintf(f, "4 %d %c\n", tt[i].index, original[i]); } fclose(f); } int main() { readInput(); solve(); writeOutput(); return 0; }