func_code_string: #include <bits/stdc++.h>   using namespace std;   namespace IO {   template <typename t>   inline void read(t& x) {     x = 0;     bool f = 1;     char ch;     for (ch = getchar(); ch <  0  ||  9  < ch; ch = getchar())       if (ch ==  - ) f ^= 1;     for (;  0  <= ch && ch <=  9 ; ch = getchar())       x = (x << 3) + (x << 1) + (ch ^ 48);     x = f ? x : -x;   }   }  // namespace IO   const int MAXN = 50 + 10;   const int CHAR_RANGE = 26 + 10;   int n, len[2], f[MAXN][MAXN];   bool can[2][MAXN][MAXN][CHAR_RANGE];   char str[2][MAXN], tmp[10];   vector<int> trans[CHAR_RANGE], rtrans[CHAR_RANGE * CHAR_RANGE + 100];   void calc(int _) {     for (int i = (1), iend = (len[_]); i <= iend; ++i)       can[_][i][i][str[_][i] -  a ] = true;     for (int l = (2), lend = (len[_]); l <= lend; ++l) {       for (int i = (1), iend = (len[_] - l + 1); i <= iend; ++i) {         int j = i + l - 1;         for (int k = (i), kend = (j - 1); k <= kend; ++k)           for (int ch1 = (0), ch1end = (25); ch1 <= ch1end; ++ch1)             if (can[_][i][k][ch1])               for (int ch2 = (0), ch2end = (25); ch2 <= ch2end; ++ch2) {                 if (can[_][k + 1][j][ch2]) {                   for (int x : rtrans[26 * ch1 + ch2]) can[_][i][j][x] = true;                 }               }       }     }   }   int main() {     scanf( %s , str[0] + 1), scanf( %s , str[1] + 1);     len[0] = strlen(str[0] + 1), len[1] = strlen(str[1] + 1);     IO::read(n);     for (int i = (1), iend = (n); i <= iend; ++i) {       scanf( %s , tmp + 1);       rtrans[26 * (tmp[4] -  a ) + tmp[5] -  a ].push_back(tmp[1] -  a );     }     memset(f, -1, sizeof f);     f[0][0] = 0;     calc(0), calc(1);     for (int i = (1), iend = (len[0]); i <= iend; ++i)       for (int j = (1), jend = (len[1]); j <= jend; ++j) {         f[i][j] = 1e9;         for (int i2 = (0), i2end = (i - 1); i2 <= i2end; ++i2)           for (int j2 = (0), j2end = (j - 1); j2 <= j2end; ++j2)             if (f[i2][j2] != -1)               for (int ch1 = (0), ch1end = (25); ch1 <= ch1end; ++ch1) {                 if (can[0][i2 + 1][i][ch1] && can[1][j2 + 1][j][ch1]) {                   f[i][j] = min(f[i2][j2] + 1, f[i][j]);                 }               }         if (f[i][j] == 1e9) f[i][j] = -1;       }     printf( %d n , f[len[0]][len[1]]);     return 0;   }   