#include <bits/stdc++.h>   using namespace std;   const int inf(1010101010);   int le_res, aa;   char naam[1000];   int le_naam;   char naam_and_res[1000];   char occ[1000];   int zvals[1000];   void z_functie(char* s, int n, int* z) {     int a(0), b(0);     for (int i(0); i < (n); i++) z[i] = n;     for (int i = 1; i < n; i++) {       int k = max(0, min(b - i, z[i - a]));       while (i + k < n && s[i + k] == s[k]) k++;       z[i] = k;       if (i + k > b) a = i, b = i + k;     }   }   bool chk(char* s) {     for (int i(0); i < (le_res); i++) naam_and_res[le_naam + 1 + i] = s[i];     naam_and_res[le_naam + 1 + le_res] = 0;     z_functie(naam_and_res, le_naam + 1 + le_res, zvals);     for (int i(0); i < (le_res - le_naam + 1); i++) {       int zz(zvals[le_naam + 1 + i]);       if (zz == le_naam && occ[i] ==  0 ) return false;       if (zz != le_naam && occ[i] ==  1 ) return false;     }     return true;   }   char tpl[1000];   char ans[1000];   int main() {     cin >> le_res >> aa;     scanf( %s , naam), le_naam = strlen(naam);     for (int i(0); i < (le_naam); i++) naam_and_res[i] = naam[i];     naam_and_res[le_naam] =  $ ;     scanf( %s , occ);     for (int i(0); i < (le_res); i++) tpl[i] =  . ;     for (int i(0); i < (le_res - le_naam + 1); i++) {       if (occ[i] ==  1 ) {         for (int j(i); j < (i + le_naam); j++) {           tpl[j] = naam[j - i];         }       }     }     for (int i(0); i < (le_naam); i++) {       char c( a  + (((naam[i] -  a ) + 1) % aa));       for (int i(0); i < (le_res); i++) {         if (tpl[i] ==  . )           ans[i] = c;         else           ans[i] = tpl[i];       }       if (chk(ans)) {         ans[le_res] = 0;         printf( %s n , ans);         goto done;       }     }     puts( No solution );   done:;   }   