func_code_string: #include <bits/stdc++.h>   using namespace std;   typedef bool mat[55][55][35];   mat adja, adjb;   char a[55], b[55], x[55], y[55], z[55];   int dp[55][55], k;   inline void upd(int &u, int v) { u = min(u, v); }   inline void work(char *str, int n, mat adj) {     memset(adj, false, 55 * 55 * 35);     for (int i = 0; i < n; i++) adj[i][i][str[i] -  a ] = true;     for (int len = 1; len < n; len++) {       for (int l = 0; l + len < n; l++) {         int r = l + len;         for (int p = l; p < r; p++) {           for (int i = 0; i < k; i++)             adj[l][r][x[i] -  a ] |=                 adj[l][p][y[i] -  a ] & adj[p + 1][r][z[i] -  a ];         }       }     }   }   int main() {     scanf( %s%s%d , a, b, &k);     int n = strlen(a), m = strlen(b);     for (int i = 0; i < k; i++) scanf( %*c%c%*c%*c%c%c , x + i, y + i, z + i);     work(a, n, adja);     work(b, m, adjb);     memset(dp, 0x3f, sizeof(dp));     dp[0][0] = 0;     for (int i = 0; i < n; i++) {       for (int j = 0; j < m; j++) {         for (int t = 0; t < 26; t++) {           for (int u = i; u < n; u++) {             for (int v = j; v < m; v++) {               if (adja[i][u][t] && adjb[j][v][t])                 upd(dp[u + 1][v + 1], dp[i][j] + 1);             }           }         }       }     }     printf( %d n , dp[n][m] == 0x3f3f3f3f ? -1 : dp[n][m]);     return 0;   }   