サマースクールキャンプオフ以上の2019頭の牛(6位)今日は金曜日ですか?

制限時間:他の言語の10秒にC ++ 5秒/ C

スペースの制限:C / C ++ 262144K、他の言語524288K
64ビットIOフォーマット:%LLD

タイトル説明

いいえ、それは金曜日ではありません:(
 
TangTangは金曜日を愛し、彼はすべての金曜日は、n-日のリストを作っています!このリストの各日付は「yyyyは」年を表す4桁の番号である「YYYY / MM / DD」として形成され、「mm」が月と「DD」を表す2桁の数字は、二です日を表す桁の数字。TangTangは1600年と9999(両端を含む)の間の年と考えて、そのリスト内の各年は常に4桁の数字を持っていますが、それが必要なときヶ月と日が先行ゼロを有することができます。たとえば、「8月3日、2019年には、」「2019年8月3日」として形成されなければなりません。
 
安全に保管するために、TangTangは、単純な換字式暗号を使用してリストを暗号化。彼は「A」と同じ数字が異なる文字に同じ文字と異なる数字に対応するように「J」間の文字で各桁に置換されています。
 
残念ながら、TangTangはどの桁に相当する文字を忘れてしまいました。彼は元のリストを復元する助けてください。

説明を入力します。

複数のテストケースがあります。最初の行は整数T(含ま1≤T≤10をテストケースの数を示します)。テストケースを以下に与えられています。

各テストケースのために、最初の行は、整数n(含ま1≤n≤1000001の日付の数を示します)。

次のn行の各々は、それぞれの数字が「A」と「J」との間の大文字で置換されている暗号化日付を表す「YYYY / MM / DD」の形式の文字列を含んでいます。

出力説明:

各テストケースのために、出力「ケース#X:Y」(引用符なし)1本のライン、xは1から始まる場合の数を示し、yは、このテストケースに対する回答を表します。

リストを復元する方法はありませんならば、yは「不可能」です。

そうでない場合、Yは、リストを解読するためのキーを表す、10個の別個の数字からなる文字列です。より具体的には、yのi番目の桁は、i番目の大文字に相当します。

少なくとも2つの方法がある場合、Yは、辞書式順序で可能な最小の文字列です。

エントリー

2 
1 
CABJ / AI / AC 
5 
CABJ / AI / AC 
CABJ / AI / AD 
CABJ / AI / EI 
CABJ / AI / AF 
CABJ / AI / AG

輸出

。#1ケース:0123456789 
ケース#2:インポッシブル

質問の意味:それぞれAJ、AJ 0-9からなる文字列を考えると(対応関係が固定されていない)、辞書順最小のような文字列が与えられている関係を見つけます金曜日。

ソリューション:アナログ、ツェラーの公式

コード:
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INT日[] = { 0312831303130313130313031 }。
ストリング S [ 100005 ]。
int型のチェック(int型の Y、int型 M、int型のD)。
INT のmain()
{ 
  int型 I、T、N、[ 10 ]、Y、M、D、フラグ、ANS、CNT =0 ; 
  scanf関数(" %のD "、&T)。
  一方、(T-- 
  { 
    のprintf(" ケース#1%のD:"、++ CNT)。
    ANS = 0 ; 
    scanf関数(" %のD "、&N)
    (i = 0 ; iがn <; iは++)CIN >> S [i]は、
    (i = 0 ; iは< 10 ; iは++)[I] = I。
    ソート(S、S + N)。  // 。去重、防止超时 
    N =ユニークな(S、S + N) - Sであり;
    やります
    { 
      フラグ= 1 ;
      (i = 0 ; iがn <; iは++ 
      { 
        Y = 1000 * [S [i]が[ 0 ] - [ A ' ] + 100 * [S [i]を[ 1 ] - [ A ' ] + 10 * [S [i]の[ 2 ] - [ A ' ] + [S [i]は[ 3 ] - [ A ' ]。
        M = 10 * [S [i]が[ 5 ] - [ A ' ] + [S [i]が[ 6] - [A " ]; 
        D = 10 * [S [i]の[ 8 ] - [ A ' ] + [S [i]が[ 9 ] - [ A ' ]。
        もし(!チェック(Y、M、D)){フラグ= 0ブレーク;} 
      } 
      場合(フラグ)
      { 
        (i = 0 ; iは< 10 ; iは++)のprintf(" %dは" 、[I])。
        printf(" \ nを" ); 
        ANS = 1  ;ブレーク
      } 
    } 
    一方(next_permutation(A + 10 ))。
    もし(!ANS)のprintf(" インポッシブル\ nを" ); 
  } 
  システム(一時停止)。
  リターン 0 ; 
} 
int型のチェック(int型の Y、int型 M、int型D)
{ 
  場合(Y < 1600戻り 0 ; //检验日期合法性
  場合(M < 1 || M> 12戻り 0 ;
  int型T = 日[M]。
  もし(m個の== 2 &&((Y%4 == 0 && Y%100 =!0)||(Yの%400 == 0)))T ++ もし(D> T)戻り 0 ; 
  
  もし(M < 3)Y- = 1、M + = 12// 蔡勒公式
  INT C = INT(Y / 100 )。
  Y = Y- 100 * C。
  INT W =(C / 4) - 2 *のC + Y +(Y / 4)+(26 *(M + 1)/ 10)+ D- 1 
  W(%W = 7 + 7%)7 戻る == wは5 
}

おすすめ

転載: www.cnblogs.com/VividBinGo/p/11314458.html