結果
| 問題 |
No.233 めぐるはめぐる (3)
|
| コンテスト | |
| ユーザー |
asugen0402
|
| 提出日時 | 2019-02-01 11:00:52 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 63 ms / 1,000 ms |
| コード長 | 5,369 bytes |
| コンパイル時間 | 1,362 ms |
| コンパイル使用メモリ | 32,384 KB |
| 実行使用メモリ | 7,896 KB |
| 最終ジャッジ日時 | 2024-11-21 17:36:17 |
| 合計ジャッジ時間 | 5,176 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 11 |
ソースコード
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// 内部定数
#define D_PTN_KIND 2 // パターン種類数
#define D_PTN_KIND_C 0 // パターン種類 - 子音
#define D_PTN_KIND_M 1 // パターン種類 - 母音
#define D_PTN_MAX 1000 // 最大パターン数
#define D_SEL_CNT 6 // 選択数
#define D_NAME_LEN 16 // 名前長
#define D_NAME_MAX 1000000 // 最大名前数
// 内部変数
static FILE *szpFpI; // 入力
static char sc3Ptn[D_PTN_KIND][D_PTN_MAX][D_SEL_CNT]; // パターン
static int si1PCnt[D_PTN_KIND]; // パターン数
static char sc2All[D_NAME_MAX][D_NAME_LEN]; // 全名前
static int siACnt; // 全名前数
static char sc2Use[D_NAME_MAX][D_NAME_LEN]; // 使用名前
static int siUCnt; // 使用名前数
// 内部変数 - テスト用
#ifdef D_TEST
static int siRes;
static FILE *szpFpA;
#endif
// 改行カット
// 戻り値:文字数
int
fCutCrLf(
char *pcpStr // <I> 文字列
)
{
int i;
for (i = 0; pcpStr[i] != '\0'; i++) {
if (pcpStr[i] == '\n') {
pcpStr[i] = '\0';
break;
}
}
return i;
}
// ソート関数 - char[]昇順
int
fSortFnc(
const void *pzpVal1 // <I> 値1
, const void *pzpVal2 // <I> 値2
)
{
char *lcpVal1 = (char *)pzpVal1;
char *lcpVal2 = (char *)pzpVal2;
// char[]昇順
return strcmp(lcpVal1, lcpVal2);
}
// パターン - セット
int
fSetPtn(
int piKind // <I> 種類 - 子音 or 母音
, char *pcpSel // <I> 選択内容
, int piSCnt // <I> 選択数
, char *pcpCCnt // <I> 文字種類
, int piCCnt // <I> 文字種類数
)
{
int i;
// 終了
if (piSCnt == D_SEL_CNT) {
// パターン - 追加
memcpy(sc3Ptn[piKind][si1PCnt[piKind]], pcpSel, sizeof(sc3Ptn[0][0]));
si1PCnt[piKind]++;
return 0;
}
// 文字種類数でループ
for (i = 0; i < piCCnt; i++) {
if (pcpCCnt[i] < 1) { // なし
continue;
}
// 選択
pcpSel[piSCnt] = i;
pcpCCnt[i]--;
// 下位へ
fSetPtn(piKind, pcpSel, piSCnt + 1, pcpCCnt, piCCnt);
// 選択キャンセル
pcpCCnt[i]++;
}
return 0;
}
// 実行メイン
int
fMain(
int piTNo // <I> テスト番号 1~
)
{
int i, j, k;
char lc1Buf[1024], lc1Out[1024];
// データ - 初期化
memset(si1PCnt, 0, sizeof(si1PCnt)); // パターン数
siACnt = 0; // 全名前数
// 入力 - セット
#ifdef D_TEST
sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
szpFpI = fopen(lc1Buf, "r");
sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
szpFpA = fopen(lc1Buf, "r");
siRes = 0;
#else
szpFpI = stdin;
#endif
// パターン - セット - 子音
char lc1Sel[D_SEL_CNT];
char lc1Cnt[D_SEL_CNT];
memset(lc1Cnt, 1, sizeof(lc1Cnt));
fSetPtn(D_PTN_KIND_C, lc1Sel, 0, lc1Cnt, 6);
// パターン - セット - 母音
lc1Cnt[0] = 2; // 'a'
lc1Cnt[3] = 2; // 'u'
fSetPtn(D_PTN_KIND_M, lc1Sel, 0, lc1Cnt, 4);
// 全名前 - セット
for (i = 0; i < si1PCnt[D_PTN_KIND_C]; i++) {
for (j = 0; j < si1PCnt[D_PTN_KIND_M]; j++) {
// 各名前 - セット
int liNo = 0;
for (k = 0; k < D_SEL_CNT; k++) {
// 子音
char lcChar;
switch (sc3Ptn[D_PTN_KIND_C][i][k]) {
case 0: lcChar = 'b'; break;
case 1: lcChar = 'g'; break;
case 2: lcChar = 'm'; break;
case 3: lcChar = 'n'; break;
case 4: lcChar = 'r'; break;
default: lcChar = 0; break;
}
if (lcChar > 0) {
sc2All[siACnt][liNo] = lcChar;
liNo++;
}
// 母音
switch (sc3Ptn[D_PTN_KIND_M][j][k]) {
case 0: lcChar = 'a'; break;
case 1: lcChar = 'e'; break;
case 2: lcChar = 'i'; break;
default: lcChar = 'u'; break;
}
sc2All[siACnt][liNo] = lcChar;
liNo++;
}
sc2All[siACnt][liNo] = '\0';
siACnt++;
}
}
// 使用名前数 - 取得
fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
sscanf(lc1Buf, "%d", &siUCnt);
// 使用名前 - 取得
for (i = 0; i < siUCnt; i++) {
fgets(sc2Use[i], sizeof(sc2Use[0]), szpFpI);
fCutCrLf(sc2Use[i]); // 改行カット
}
// 解答 - 取得
char lc1Ans[D_NAME_LEN];
if (siACnt == siUCnt) {
strcpy(lc1Ans, "NO");
}
else {
// ソート
qsort(sc2All, siACnt, sizeof(sc2All[0]), fSortFnc); // 全名前
qsort(sc2Use, siUCnt, sizeof(sc2Use[0]), fSortFnc); // 使用名前
// 不一致名称の検索
for (i = 0; i < siACnt; i++) {
if (strcmp(sc2All[i], sc2Use[i])) {
break;
}
}
strcpy(lc1Ans, sc2All[i]);
}
// 結果 - セット
sprintf(lc1Out, "%s\n", lc1Ans);
// 結果 - 表示
#ifdef D_TEST
fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
if (strcmp(lc1Buf, lc1Out)) {
siRes = -1;
}
#else
printf("%s", lc1Out);
#endif
// 残データ有無
#ifdef D_TEST
lc1Buf[0] = '\0';
fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
if (strcmp(lc1Buf, "")) {
siRes = -1;
}
#endif
// テストファイルクローズ
#ifdef D_TEST
fclose(szpFpI);
fclose(szpFpA);
#endif
// テスト結果
#ifdef D_TEST
if (siRes == 0) {
printf("OK %d\n", piTNo);
}
else {
printf("NG %d\n", piTNo);
}
#endif
return 0;
}
int
main()
{
#ifdef D_TEST
int i;
for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
fMain(i);
}
#else
fMain(0);
#endif
return 0;
}
asugen0402