题目描述:
D - Coloring Dominoes
Time Limit: 2 sec / Memory Limit: 256 MB
Score : 400400 points
Problem Statement
We have a board with a 2×N2×N grid. Snuke covered the board with NN dominoes without overlaps. Here, a domino can cover a 1×21×2 or 2×12×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 10000000071000000007.
The arrangement of the dominoes is given to you as two strings S1S1 and S2S2 in the following manner:
- Each domino is represented by a different English letter (lowercase or uppercase).
- The jj-th character in SiSi represents the domino that occupies the square at the ii-th row from the top and jj-th column from the left.
Constraints
- 1≤N≤521≤N≤52
- |S1|=|S2|=N|S1|=|S2|=N
- S1S1 and S2S2 consist of lowercase and uppercase English letters.
- S1S1 and S2S2 represent a valid arrangement of dominoes.
Input
Input is given from Standard Input in the following format:
NN S1S1 S2S2Output
Print the number of such ways to paint the dominoes, modulo 10000000071000000007.
Sample Input 1 Copy
Copy
3 aab ccbSample Output 1 Copy
Copy
6There are six ways as shown below:
Sample Input 2 Copy
Copy
1 Z ZSample Output 2 Copy
Copy
3Note that it is not always necessary to use all the colors.
Sample Input 3 Copy
Copy
52 RvvttdWIyyPPQFFZZssffEEkkaSSDKqcibbeYrhAljCCGGJppHHn RLLwwdWIxxNNQUUXXVVMMooBBaggDKqcimmeYrhAljOOTTJuuzznSample Output 3 Copy
Copy
958681902
题意:
一个两行N列的棋盘,棋盘由一些1*2的地板组成,明确告诉你每块地板怎么放,现在让你对地板涂色,三种颜色可供选择,相邻不同色。
思路:
咋一看什么dp,状压的都出来了,但是题目限制了棋盘只有两行,所以情况特别少,直接模拟即可,第一眼确实被吓住了,然后就没啥了。
AC代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<cstdio>
#include<algorithm>
#define LL long long
#define INF 1ll<<60
using namespace std;
const int N=2e5+100;
const int M=4e5+100;
const int mod=1e9+7;
int main(){
int n;
string s1,s2;
while(cin>>n){
cin>>s1>>s2;
LL ans=1;
for(int i=0;i<n;i++){
if(s1[i]==s2[i]){
if(i==0)ans*=3;
else{
if(s1[i-1]==s2[i-1]){
ans=(ans*2)%mod;
}else{
ans=ans;
}
}
}else {
if(i==0)ans*=6;
else{
if(s1[i-1]==s2[i-1]){
ans=(ans*2)%mod;
}else{
ans=(ans*3)%mod;
}
}
i++;
}
}
cout<<ans<<endl;
}
return 0;
}
The end;