output_description: Print the number of such ways to paint the dominoes, modulo 1000000007.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N
      S_1
      S_2
attempt: #include <bits/stdc++.h>
  using namespace std;
  #define rep(i,N) for(int i=0,i##_max=(N);i<i##_max;++i)
  #define repp(i,l,r) for(int i=(l),i##_max=(r);i<i##_max;++i)
  #define per(i,N) for(int i=(N)-1;i>=0;--i)
  #define perr(i,l,r) for(int i=r-1,i##_min(l);i>=i##_min;--i)
  #define all(arr) (arr).begin(), (arr).end()
  #define SP << " " <<
  #define SPF << " "
  #define SPEEDUP cin.tie(0);ios::sync_with_stdio(false);
  #define MAX_I INT_MAX //1e9
  #define MIN_I INT_MIN //-1e9
  #define MAX_UI UINT_MAX //1e9
  #define MAX_LL LLONG_MAX //1e18
  #define MIN_LL LLONG_MIN //-1e18
  #define MAX_ULL ULLONG_MAX //1e19
  typedef long long ll;
  typedef pair<int,int> PII;
  typedef pair<char,char> PCC;
  typedef pair<ll,ll> PLL;
  typedef pair<char,int> PCI;
  typedef pair<int,char> PIC;
  typedef pair<ll,int> PLI;
  typedef pair<int,ll> PIL; 
  typedef pair<ll,char> PLC; 
  typedef pair<char,ll> PCL; 
  
  inline void YesNo(bool b){ cout << (b?"Yes" : "No") << endl;}
  inline void YESNO(bool b){ cout << (b?"YES" : "NO") << endl;}
  inline void Yay(bool b){ cout << (b?"Yay!" : ":(") << endl;}
  
  template<int MOD> struct Fp {
      ll val;
      constexpr Fp(ll v = 0) noexcept : val(v % MOD) {
          if (val < 0) v += MOD;
      }
      constexpr int getmod() { return MOD; }
      constexpr Fp operator - () const noexcept {
          return val ? MOD - val : 0;
      }
      constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
      constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
      constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
      constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
      constexpr Fp& operator += (const Fp& r) noexcept {
          val += r.val;
          if (val >= MOD) val -= MOD;
          return *this;
      }
      constexpr Fp& operator -= (const Fp& r) noexcept {
          val -= r.val;
          if (val < 0) val += MOD;
          return *this;
      }
      constexpr Fp& operator *= (const Fp& r) noexcept {
          val = val * r.val % MOD;
          return *this;
      }
      constexpr Fp& operator /= (const Fp& r) noexcept {
          long long a = r.val, b = MOD, u = 1, v = 0;
          while (b) {
              long long t = a / b;
              a -= t * b; swap(a, b);
              u -= t * v; swap(u, v);
          }
          val = val * u % MOD;
          if (val < 0) val += MOD;
          return *this;
      }
      constexpr bool operator == (const Fp& r) const noexcept {
          return this->val == r.val;
      }
      constexpr bool operator != (const Fp& r) const noexcept {
          return this->val != r.val;
      }
      friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept {
          return os << x.val;
      }
      friend constexpr istream& operator >> (istream &is, Fp<MOD>& x) noexcept {
          return is >> x.val;
      }
      friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept {
          if (n == 0) return 1;
          auto t = modpow(a, n / 2);
          t = t * t;
          if (n & 1) t = t * a;
          return t;
      }
  };
  
  
  //const int MOD = 998244353;
  //const int MOD = 1e6 + 3;
  const int MOD = 1e9 + 7;
  const int N_MAX = 1e5+5;
  //mint:mod演算のための型
  using mint = Fp<MOD>;
  //型変換
  #define MINT (mint)
  
  //mod MOD上での階乗
  mint fact[N_MAX];
  void init(){
    fact[0] = fact[1] = MINT 1;
    for(int i = 2; i < N_MAX; i++){
      fact[i] = fact[i-1] * i;
    }
  }
  
  //mod MOD上での逆元
  inline mint inv(mint n){
    return modpow(n,MOD-2);
  }
  
  //二項係数の計算(mod MOD上)
  inline mint COM(int n, int k){
    if(n<k) return 0;
    return fact[n]/(fact[k]*fact[n-k]);
  }
  
  int main(void){
    SPEEDUP
    cout << setprecision(15);
    int N;cin >> N;
    string s1,s2;cin >> s1 >> s2;
    mint ans = 3;
    int pre = (s1[0] == s2[0]) ? 1:2;
    ans*=pre;
    repp(i,1,N){
      if(pre==2)++i;
      if(pre == 1) ans*=2;
      else if(s1[i] != s2[i]) ans*=3;
      pre = (s1[i] == s2[i]) ? 1:2;
    }
    cout << ans << endl;
    return 0;
  } 
  
  
problem_description: Statement
  
  We have a board with a 2 \times N grid. Snuke covered the board with N
  dominoes without overlaps. Here, a domino can cover a 1 \times 2 or 2 \times 1
  square.
  
  Then, Snuke decided to paint these dominoes using three colors: red, cyan and
  green. Two dominoes that are adjacent by side should be painted by different
  colors. Here, it is not always necessary to use all three colors.
  
  Find the number of such ways to paint the dominoes, modulo 1000000007.
  
  The arrangement of the dominoes is given to you as two strings S_1 and S_2 in
  the following manner:
  
    * Each domino is represented by a different English letter (lowercase or uppercase).
    * The j-th character in S_i represents the domino that occupies the square at the i-th row from the top and j-th column from the left.
samples: [{"input": "3\n    aab\n    ccb", "output": "6\n    \n\nThere are six ways as shown below:\n\n![](https://atcoder.jp/img/arc081/899673bd23529f4fb5e41c6e7d5bc372.png)\n\n* * *"}, {"input": "1\n    Z\n    Z", "output": "3\n    \n\nNote that it is not always necessary to use all the colors.\n\n* * *"}, {"input": "52\n    RvvttdWIyyPPQFFZZssffEEkkaSSDKqcibbeYrhAljCCGGJppHHn\n    RLLwwdWIxxNNQUUXXVVMMooBBaggDKqcimmeYrhAljOOTTJuuzzn", "output": "958681902"}]