DreamGridが麻雀のセットを見つけました 彼のポケットに適したタイルとホワイトドラゴンタイル。適した各タイルには、スーツ(キャラクター、竹、またはドット)とランク(1からの範囲)があります。)、各ランクとスーツの組み合わせのタイルは1つだけです。
ランクが1から9のキャラクタータイル
ランクが1から9の範囲の竹タイル
ランクが1から9の範囲のドットタイル
ホワイトドラゴンタイル
DreamGridが退屈しているので、彼はこれらのタイルで遊ぶことにしました。彼は最初に 「ラッキータイル」として適したタイル、そして彼は選ぶ のセットからのタイル これらを並べて並べ替えます 次のルールのタイル:
「ラッキータイル」に含まれている場合 タイルは、左端の位置に配置する必要があります。
2つのタイルの場合 そして どちらも「ラッキータイル」ではないように
キャラクタータイルであり、 竹タイル、または
キャラクタータイルであり、 ドットタイル、または
竹タイルであり、 ドットタイル、または
そして 同じスーツとランクを持っている のランクよりも小さい 、
ホワイトドラゴンタイルは特別なタイルです。に含まれている場合タイルの場合、並べ替え中にラッキータイルの元の(ラッキーではない)バージョンと見なされます。たとえば、次の並べ替えられたタイルについて考えてみます。ここでは、「3文字」がラッキータイルとして選択されています。この場合、ホワイトドラゴンタイルは「3キャラクター」のオリジナルの不運なバージョンと見なされ、「2キャラクター」と「4キャラクター」の間に配置する必要があります。
DreamGridはかなり忘れているので、並べ替えた後、ラッキータイルが何であるかをすぐに忘れてしまいます。与えられた 並べ替えられたタイル、DreamGridに可能なラッキータイルの数を教えてください。
入力
複数のテストケースがあります。入力の最初の行には整数が含まれています、テストケースの数を示します。各テストケースについて:
最初の行には2つの整数が含まれています そして ((、 )、ソートされたタイルの数と適切なタイルの最大ランクを示します。
次のために 線、 -行目は -左から右に数えて、並べ替えられたタイル。行は大文字で始まります (()、のスーツを示します -番目のタイル:
場合 、次に整数 (()が続き、ランク付きのキャラクタータイルであることを示します ;
場合 、次に整数 (()が続き、ランク付きの竹タイルであることを示します ;
場合 、次に整数 (()が続き、ランク付きのドットタイルであることを示します ;
場合 、それからそれは白いDrangonタイルです。
幸運なタイルが少なくとも1つ存在することが保証されており、 すべてのテストケースでを超えない 。
出力
テストケースごとに、1つの整数を含む1行を出力し、可能なラッキータイルの数を示します。
サンプル入力
4 3 9 C 2 W C 4 6 9 C 2 C 7 W B 3 B 4 D 2 3100 C 2 W C 9 3 9 C 1 B 2 D 3
サンプル出力
2 4 7 25
ヒント
最初のサンプルでは、「2文字」と「3文字」がラッキータイルの可能性があります。
2番目のサンプルでは、「8文字」、「9文字」、「1竹」、「2竹」がラッキータイルの可能性があります。
トピックの意味はBaiduです。可能性をランク付けしましょう。
1.1。Wはありますか
2.2。Wの前にゼロ、1、2
3.3。Wの後ろにありますか
c1 w c3 //最初のものを含める
c1 c2 w c4 //最初のものは含まれません
c1 w //すべて
c2 w //先行するc2は含まれません
c1 c2 w //上記より2つ少ない
w //すべて
c1 //すべて
w c2 // c2の最初の場所
c1 b1 d1 // 3m-n + 1
#include <bits / stdc ++。h>
using namespace std;
int main()
{ int n、shu; long long int a、b; int i、j、k、f; long long int s = 0; vector <int> ss; チャーパイ; scanf( "%d"、&n); while(n-) { j = 0; f = 0; k = 0; ss.clear(); scanf( "%d%d"、&a、&b); getchar(); for(i = 0; i <a; i ++) { s = 0; scanf( "%c"、&pai); getchar(); if(pai == 'B')s = b; else if(pai == 'D')s = b + b; else if(pai == 'W'
if(ss.size()== 1){s = ss [ss.size()-1]; ss.push_back(s);}
else if(ss.size()== 0){ss.push_back( 1); }
else if(ss.size()> 1){s = ss [ss.size()-1] +1; ss.push_back(s);}
続行;
}
scanf( "%d"、&shu);
getchar();
s = s + shu;
ss.push_back(s);
}
for(i = 0; i <ss.size()-1; i ++)
{ if(ss [i]> ss [i + 1]){printf( "1 \ n"); k = 1; break; } } if(k == 1)continue; if(f == 1) { if(ss.size()== 1)printf( "%d \ n"、3 * b);
else if(j == a-1 && ss.size()== 2)printf( "%d \ n"、(3 * b)-ss [j] +1);
else if(j == a-1)printf( "%d \ n"、(3 * b)-ss [j]);
else printf( "%d \ n"、ss [j + 1] -ss [j]);
}
if(f == 0)
{ printf( "%d \ n"、3 * b-ss.size()+ 1); } } }