题意:给你两行相等长度的字符串,你有R\G\B三种颜色可选,颜色可以涂一个1*2的矩形,要么横要么竖,不能存在两个相邻矩形颜色相同,给出的字符串代表的是矩形可以摆放的方向。求最多有多少种涂色的方法。


题解:这个要在草稿纸上画一画自己分类讨论一下才能好理解,比赛的时候画是画了,但是由于代码写的太low导致出了bug,赛后补了。要注意特判前面第一个对后面的影响,到了后面就都是规律了。


代码:

#include <iostream>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
 
typedef long long LL;
#define lowbit(x) ((x)&(-x))
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))
#defineGE() printf(">----------\n")
#defineIN() freopen("in.txt","r",stdin)
#defineOUT() freopen("out.txt","w",stdout)
const int mod=1000000007;
const int inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const double eps=1e-8;
const int maxn=105;
 
char s1[maxn], s2[maxn];
int len;
 
int main()
{
   while(~scanf("%d%s%s", &len, &s1, &s2)){
       if(len==1){
           printf("3\n");break;
       }
       LL ans;
       int i, flag=0;             //flag=0,竖,flag=1,横
       if(s1[0]==s1[1]){
           ans=6;
           i=2;
           flag=1;
       }
       else{   //竖
           ans=3;
           i=1;
       }
       for(i;i<len;i++){
           if(flag){   //前面是横
               if(s1[i]==s1[i+1]){  //当前是横
                   ans=(ans*3)%mod;
                   i++;
               }
               else{               //当前是竖
                   //不变
                   flag=0;
               }
           }
           else{       //前面是竖
               if(s1[i]==s1[i+1]){  //当前是横
                   ans=(ans*2)%mod;
                   i++;
                   flag=1;
               }
               else{               //当前是竖
                   ans=(ans*2)%mod;
               }
           }
       }
       printf("%lld\n", ans);
   }
   return 0;
}