#include<iostream>
#include<sstream>
#include<fstream>
#include<map>
#include<vector>
#include<stdio.h>
#include <queue>
using namespace std;
const long del=50;
int main(int argc, char** argv){
  ifstream subor1(argv[1], ifstream::in);//subor so sekvenciou
  ifstream subor2(argv[2], ifstream::in);//subor s labelovanim
  ifstream subor3(argv[3], ifstream::in);//subor s priradenim labelov k stavom
  ifstream subor4(argv[4], ifstream::in);//subor s DNA abecedou
  /*
  pocet stavov n
  n riadkov s label stav
  nahadze do map<char,int>
  */
  map<char,int> label;
  map<char,int> abeceda;
  char z;
  int c;
  int poc_stavov=0;
  const int kontext=3;
  long sek=0;
  long d=1;
  for(int t=0;t<kontext;t++) d=d*4;
  subor3 >> poc_stavov;
  while(subor3 >> z >> c) label.insert(make_pair(z,c));
  while(subor4 >> z >> c) abeceda.insert(make_pair(z,c));
  //cerr << "k1" << endl;
  char c1,c2;
  double pocty[poc_stavov];
  double poctyr[d][poc_stavov];
  double sumy[poc_stavov][d][4];
  double stavy[poc_stavov][poc_stavov];
  priority_queue<double> priemery[poc_stavov][d][4];
  priority_queue<double> prechody[poc_stavov][poc_stavov];
  for(int i=0;i<poc_stavov;i++){
    pocty[i]=0;
    for(long s=0;s<d;s++){
      poctyr[s][i]=0;
    for(int pis=0;pis<4;pis++){
      sumy[i][s][pis]=0; 
      priemery[i][s][pis].push(0.25);
      priemery[i][s][pis].pop();
    }
    }
    //pocty[i]=0;
    for(int j=0;j<poc_stavov;j++){
      stavy[i][j]=0;
      prechody[i][j].push(1.0/poc_stavov);
       prechody[i][j].pop();
    }
  
  }
  //cerr << "k2" << endl;
  
  int predch=0;
  string zahod;
  while((subor1 >> c1)&&(subor2 >> c2)){
    if (c1=='>') {
      subor1 >> zahod;
      subor2 >> zahod;
      
    }//zahodi riadok, dufam 
    else{
      // cerr << c1 << " " << c2 << endl;
      sek=(sek*4+abeceda[c1])%d;
      if(pocty[label[c2]]>del-1){       
	/*for(int j=0;j<4;j++){
	  priemery[label[c2]][j].push(sumy[label[c2]][j]/pocty[label[c2]]);
	  sumy[label[c2]][j]=0;
	}*/
	
	for(int stav=0;stav<poc_stavov;stav++){
	  prechody[label[c2]][stav].push(stavy[label[c2]][stav]/pocty[label[c2]]);
	  stavy[label[c2]][stav]=0;
	}
	pocty[label[c2]]=0;
      }
      if(poctyr[sek][label[c2]]>del-1){       

      for(int j=0;j<4;j++){
	sumy[label[c2]][sek][abeceda[c1]]++;
	priemery[label[c2]][sek][j].push(sumy[label[c2]][sek][j]/poctyr[sek][label[c2]]);
	sumy[label[c2]][sek][j]=0;
	}
	poctyr[sek][label[c2]]=0;
      
    }
      
      sumy[label[c2]][sek][abeceda[c1]]++;
      stavy[predch][label[c2]]++;
      predch=label[c2];
      pocty[label[c2]]++;
      poctyr[sek][label[c2]]++;
      //  cerr << label[c2] << endl;
    }
  }
  /*
  Zaciatok vypisu natrenovaneho modelu
  
  */
  cout << poc_stavov << " " << 4 << " " << 1 << endl;
  cout << 1.0;
  for(int i=1;i<poc_stavov;i++) cout << " " << 0.0;
  cout << endl;
  
  for(int stav=0;stav<poc_stavov;stav++){
 // if (stavy[stav][1]>0) cerr << stav <<" jsdc" << endl;
  //   cerr << stav << endl;
  cout << endl;
  bool t=false;
  for(int i=0;i<poc_stavov;i++){
  if (!prechody[stav][i].empty()){ 
    
    t=true;} else cerr << stav << " " << i << " k   ";
  }
//  cerr << endl;
 // cerr << stav << " s " << pocty[stav] << endl;
  if((pocty[stav]>0)||t){
    for(int i=0;i<poc_stavov;i++){
      // cerr << "stav " << stav << " i " << i << endl;
      double poc=0;
      double sum=0;
      
      if(pocty[stav]>0) prechody[stav][i].push(stavy[stav][i]/del);
      poc=poc+pocty[stav]/del;
      if(prechody[stav][i].empty()) sum=0; 
      else{ sum=prechody[stav][i].top();
      prechody[stav][i].pop();}
      while(!prechody[stav][i].empty()) {
	double pom=prechody[stav][i].top();
	prechody[stav][i].pop();
	prechody[stav][i].push(sum+pom);
	sum=prechody[stav][i].top();
	prechody[stav][i].pop();
	poc=poc+1;	  
	//if((i==1)&&(sum>0)) cerr << stav << " " << sum << endl;
      }
      cerr << stav << " " << i << "  p " << poc << " "<< sum << endl;  
      if(poc>0){sum=sum/poc;}else sum=0;
      printf("%f  ", sum);
    }
    cout << endl;}
    else for(int j=0;j<poc_stavov;j++) cout << 1.0/poc_stavov << " ";
    cout << endl;
}


for(int stav=0;stav<poc_stavov;stav++){
  cout << kontext << endl;
  
  
  for(long s=0;s<d;s++){
    bool t=false;
  for(int pis=0;pis<4;pis++){
    if (!priemery[stav][s][pis].empty()) t=true;
  }
  if (t){
    double f[4];
    for(int pis=0;pis<4;pis++){
      double poc=0;
      double sum=0;
      priemery[stav][s][pis].push(sumy[stav][s][pis]/del);
      //cerr << stav << " " << pis << " " << sumy[stav][pis] << endl;
      poc=poc+poctyr[s][stav]/del;
      if (priemery[stav][s][pis].empty())  sum=0; else {sum=priemery[stav][s][pis].top();
      priemery[stav][s][pis].pop();}
      while(!priemery[stav][s][pis].empty()) {
	double pom=priemery[stav][s][pis].top();
	// cerr << pom << " l"<<endl;
	priemery[stav][s][pis].pop();
	priemery[stav][s][pis].push(sum+pom);
	sum=priemery[stav][s][pis].top();
	priemery[stav][s][pis].pop();
	poc=poc+1;
      }
      cerr << "p2 " << poc << " "<< sum << endl;  
      if(poc>0)sum=sum/poc;else sum=0;
     // if(sum>1.0) sum=1.0;
     // printf(" %f ", double(sum));
     f[pis]=sum;
      cerr << stav << " " << s << " " << pis << "     " << poc << endl;
      
    }
    //cout << endl;
    cerr <<  endl;
    double ps=0;
    for(int p=0;p<4;p++){
      f[p]=f[p]+0.1;
      ps=ps+f[p];
    }
    for(int p=0;p<4;p++){
      f[p]=f[p]/ps;
      printf(" %f ", f[p]);
    }
    cout << endl;
    
  } else cout << 0.25 << " " << 0.25 << " " << 0.25 << " " << 0.25 << endl;
  }
  cerr << endl << endl << endl;
  cout << endl << endl;
}



//cerr << "kontrola 5" << endl;  


/*
for(int stav=0;stav<poc_stavov;stav++){
  cout << 0 << " ";
  bool t=false;
  for(int pis=0;pis<4;pis++){
    if (!priemery[stav][pis].empty()) t=true;
  }
  if ((pocty[stav]>0)||t){
    for(int pis=0;pis<4;pis++){
      double poc=0;
      double sum=0;
      priemery[stav][pis].push(sumy[stav][pis]/del);
      //cerr << stav << " " << pis << " " << sumy[stav][pis] << endl;
      poc=poc+pocty[stav]/del;
      if (priemery[stav][pis].empty())  sum=0; else {sum=priemery[stav][pis].top();
      priemery[stav][pis].pop();}
      while(!priemery[stav][pis].empty()) {
	double pom=priemery[stav][pis].top();
	// cerr << pom << " l"<<endl;
	priemery[stav][pis].pop();
	priemery[stav][pis].push(sum+pom);
	sum=priemery[stav][pis].top();
	priemery[stav][pis].pop();
	poc=poc+1;
      }
      cerr << "p2 " << poc << " "<< sum << endl;  
      if(poc>0)sum=sum/poc;else sum=0;
      printf(" %f ", double(sum));
      
    }
    cout << endl;
  } else cout << 0.25 << " " << 0.25 << " " << 0.25 << " " << 0.25 << endl;
}
*/


return 0;
}


  
  
  
  
  
  
  
  
  
/*  
  
  
  for(int stav=0;stav<poc_stavov;stav++){  
    cout << endl;
    for(int i=0;i<poc_stavov;i++){
      double poc=0;
      double sum=prechody[stav][i].top();
      prechody[stav][i].pop();
      prechody[stav][i].push(sumy[stav][i]/pocty[stav]/del);
      while(!prechody[stav][i].empty()) {
	double pom=prechody[stav][i].top();
	prechody[stav][i].pop();
	prechody[stav][i].push(sum+pom);
	sum=prechody[stav][i].top();
	prechody[stav][i].pop();
	poc=poc+1;	  
	//  cerr << endl << endl << (*it) << endl << endl;
	//  cerr << "k3"<< endl;
      }
      //cerr << poc << " " << sum << endl;
      poc=poc+pocty[stav]/del;
      //sum=sum+stavy[stav][i]/pocty[stav]/del;
      sum=sum/poc;
      int y=i;
      //cerr << y << endl;
      //cerr << poc << " " << sum << endl;
      printf("%f  ", sum);
    }
    cout << endl;
  }
  
  
  
  
  
  
  for(int stav=0;stav<poc_stavov;stav++){
    //cout << endl << " stav: " << stav << endl;
    cout << 0 << " ";
    if (pocty[stav]>0){
      for(int pis=0;pis<4;pis++){
	//cerr << pis << endl;
	double poc=0;
	double sum=priemery[stav][pis].top();
	priemery[stav][pis].pop();
	priemery[stav][pis].push(sumy[stav][pis]/pocty[stav]/del);
	while(!priemery[stav][pis].empty()) {
	  double pom=priemery[stav][pis].top();
	  priemery[stav][pis].pop();
	  priemery[stav][pis].push(sum+pom);
	  sum=priemery[stav][pis].top();
	  priemery[stav][pis].pop();
	  poc=poc+1;	  
	  //  cerr << endl << endl << (*it) << endl << endl;
	  //  cerr << "k3"<< endl;
	}
	
	//cerr << pocty[stav] << " " << sumy[stav][pis] << endl;
	poc=poc+pocty[stav]/del;
	//sum=sum+sumy[stav][pis]/pocty[stav]/del;
	sum=sum/poc;
	//int p=pis;
	printf(" %f ", double(sum));
	cerr << sumy[stav][pis] << " " << pocty[stav] << " " <<sumy[stav][pis]/pocty[stav] << endl;
	cerr << poc << " " << sum << endl;
	
	cout << "pismeno: " <<  pis << " frekv: "  <<sum << " " << endl;
      }
      cout << endl;
    } else cout << 0.25 << " " << 0.25 << " " << 0.25 << " " << 0.25 << endl;
  }
  
  
  
  return 0;
}*/