1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include<bits/stdc++.h>

using namespace std;

  const long long stala=1000000007;

  long long NpoK[10001][10001]={};

  string s1,s2,s3;
  long long r1,r2,r3,d12,d13,d23,a,b,c,d,n;

void TworzNpoK(){
  for(int n=0;n<10001;n++){
    NpoK[n][0]=1; NpoK[n][n]=1;
    for(int k=1;k<n;k++){
      NpoK[n][k]=(NpoK[n-1][k-1]+NpoK[n-1][k])%stala;
    }
  }
  return;
}

void licz_abcd(){
  a=0;b=0;c=0;d=0;
  for(int i=0;i<n;i++){
         if(s1[i]!=s2[i] && s1[i]!=s3[i]) a++;
    else if(s1[i]!=s2[i] && s1[i]==s3[i]) b++;
    else if(s1[i]==s2[i] && s1[i]!=s3[i]) c++;
    else if(s1[i]==s2[i] && s1[i]==s3[i]) d++;
  }
  return;
}

long long ODL(string sss1, string sss2){
  long long d=0;
  for(int i=0;i<n;i++) if(sss1[i]!=sss2[i]) d++;
  return d;
}

int main()
{
  ios_base::sync_with_stdio(0);
  TworzNpoK();
  cin >> n;
  cin >> r1 >> s1;
  cin >> r2 >> s2;
  cin >> r3 >> s3;
  d12=ODL(s1,s2);
  d23=ODL(s2,s3);
  d13=ODL(s1,s3);
  licz_abcd();

  long long w = 0;

  for(long long i=0;i<=r1;i++) w=(w+NpoK[n][i])%stala;
  for(long long i=0;i<=r2;i++) w=(w+NpoK[n][i])%stala;
  for(long long i=0;i<=r3;i++) w=(w+NpoK[n][i])%stala;

  long long tmp=0;
  // 1 2
  if(r1+r2>=d12){
      long long ROWNE=c+d, ROZNE=a+b;
      long long poczY=d12-r2; if(poczY<0) poczY=0;
      long long koniecY=r1; if(r1>ROZNE) koniecY=ROZNE;
      for(long long y=poczY;y<=koniecY;y++){
        long long konX=r1-y; if(konX>ROWNE) konX=ROWNE; if(konX>y-(d12-r2)) konX=y-(d12-r2);
        for(long long x=0;x<=konX;x++){
          tmp=(tmp+((NpoK[ROWNE][x]*NpoK[ROZNE][y])%stala))%stala;
        }
      }
  }



  // 1 3
  if(r1+r3>=d13){
      long long ROWNE=b+d, ROZNE=a+c;
      long long poczY=d13-r3; if(poczY<0) poczY=0;
      long long koniecY=r1; if(r1>ROZNE) koniecY=ROZNE;
      for(long long y=poczY;y<=koniecY;y++){
        long long konX=r1-y; if(konX>ROWNE) konX=ROWNE; if(konX>y-(d13-r3)) konX=y-(d13-r3);
        for(long long x=0;x<=konX;x++){
          tmp=(tmp+((NpoK[ROWNE][x]*NpoK[ROZNE][y])%stala))%stala;
        }
      }
  }



  // 2 3
  if(r2+r3>=d23){
      long long ROWNE=a+d, ROZNE=b+c;
      long long poczY=d23-r3; if(poczY<0) poczY=0;
      long long koniecY=r2; if(r2>ROZNE) koniecY=ROZNE;
      for(long long y=poczY;y<=koniecY;y++){
        long long konX=r2-y; if(konX>ROWNE) konX=ROWNE; if(konX>y-(d23-r3)) konX=y-(d23-r3);
        for(long long x=0;x<=konX;x++){
          tmp=(tmp+((NpoK[ROWNE][x]*NpoK[ROZNE][y])%stala))%stala;
        }
      }
  }


  w=w-tmp; if(w<0) w=w+stala;



  // 1 2 3
  if(r1+r2>=d12 && r1+r3>=d13 && r2+r3>=d23){
    long long tmp=0;
    for(long long x=0; x<=a;x++){
      long long poczY=d12-r2-x; if(poczY<0) poczY=0;
      for(long long y=poczY; y<=b;y++){
        long long poczZ=d13-r3-x; if(poczZ<0) poczZ=0;
        long long konZ=r1-(x+y); if(konZ>(x+y)-(d12-r2)) konZ=(x+y)-(d12-r2); if (konZ>c) konZ=c;
        for(long long z=poczZ; z<=konZ;z++){
          long long konV=r1-(x+y)-z; if(konV>(x+y)-(d12-r2)-z) konV=(x+y)-(d12-r2)-z; if(konV>r1-(x+z)-y) konV=r1-(x+z)-y; if(konV>(x+z)-(d13-r3)-y) konV=(x+z)-(d13-r3)-y; if(konV>d) konV=d;
          for(long long v=0; v<=konV;v++){
            long long ttt=NpoK[a][x];
            ttt=(ttt*NpoK[b][y])%stala;
            ttt=(ttt*NpoK[c][z])%stala;
            ttt=(ttt*NpoK[d][v])%stala;
            tmp=(tmp+ttt)%stala;
          }
        }
      }
    }

    w= (w+tmp)%stala;
  }
  cout << w;
  return 0;
}