結果
| 問題 |
No.9006 マルチバイト文字テスト(テスト用)
|
| ユーザー |
|
| 提出日時 | 2015-06-04 17:25:29 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,369 bytes |
| コンパイル時間 | 452 ms |
| コンパイル使用メモリ | 56,420 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-06 14:07:18 |
| 合計ジャッジ時間 | 817 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
ソースコード
#include <iostream>
#include <string>
/*使用する文字コードに応じて定義する*/
#define SHIFT_JIS
/*#define EUC*/
/*#define UTF_8*/
/*
参考
http://ash.jp/code/code.htm
*/
/*次の一文字のバイト数を判定する*/
/*Shift-JIS用*/
#ifdef SHIFT_JIS
int mozilen_hantei(const unsigned char* moziretu) {
/*文字列終端*/
if (moziretu[0] == 0)return 0;
/*次が文字列終端*/
if (moziretu[1] == 0)return 1;
if (
(
(moziretu[0] >= 0x81 && moziretu[0] <= 0x9F) ||
(moziretu[0] >= 0xE0 && moziretu[0] <= 0xEF)
) && (
(moziretu[1] >= 0x40 && moziretu[1] <= 0x7E) ||
(moziretu[1] >= 0x80 && moziretu[1] <= 0xFC)
)
)return 2;
/*その他*/
return 1;
}
#endif
/*EUC用*/
#ifdef EUC
int mozilen_hantei(const unsigned char* moziretu) {
/*文字列終端*/
if (moziretu[0] == 0)return 0;
/*次が文字列終端*/
if (moziretu[1] == 0)return 1;
if (moziretu[0] == 0x8E && (moziretu[1] >= 0xA1 && moziretu[1] <= 0xDF))
return 2;
if (
(moziretu[0] >= 0xA1 && mozireut[0] <= 0xFE) &&
(moziretu[1] >= 0xA1 && moziretu[1] <= 0xFE)
)return 2;
if (
moziretu[0] == 0z8F &&
(moziretu[1] >= 0xA1 && moziretu[1] <= 0xFE) &&
(moziretu[2] >= 0xA1 && moziretu[2] <= 0xFE) &&
)return 3;
/*その他*/
return 1;
}
#endif
/*UTF-8用*/
#ifdef UTF_8
int mozilen_hantei(const unsigned char* moziretu) {
int max, result;
for (max = 0; max<6; max++) {
if (moziretu[max] == 0)break;
}
result = 1;
if ((moziretu[0] & 0x80) == 0x00)result = 1;
else if ((moziretu[0] & 0xE0) == 0xC0 && max >= 2) {
if ((moziretu[1] & 0xC0) == 0x80)result = 2;
} else if ((moziretu[0] & 0xF0) == 0xE0 && max >= 3) {
if ((moziretu[1] & 0xC0) == 0x80 &&
(moziretu[2] & 0xC0) == 0x80)result = 3;
} else if ((moziretu[0] & 0xF8) == 0xF0 && max >= 4) {
if ((moziretu[1] & 0xC0) == 0x80 &&
(moziretu[2] & 0xC0) == 0x80 &&
(moziretu[3] & 0xC0) == 0x80)result = 4;
} else if ((moziretu[0] & 0xFC) == 0xF8 && max >= 5) {
if ((moziretu[1] & 0xC0) == 0x80 &&
(moziretu[2] & 0xC0) == 0x80 &&
(moziretu[3] & 0xC0) == 0x80 &&
(moziretu[4] & 0xC0) == 0x80)result = 5;
} else if ((moziretu[0] & 0xFE) == 0xFC && max >= 6) {
if ((moziretu[1] & 0xC0) == 0x80 &&
(moziretu[2] & 0xC0) == 0x80 &&
(moziretu[3] & 0xC0) == 0x80 &&
(moziretu[4] & 0xC0) == 0x80 &&
(moziretu[5] & 0xC0) == 0x80)result = 6;
}
if (result>max)result = max;
return result;
}
#endif
int main(void) {
std::string inputstr;
std::string outputstr;
const char* input;
int* onelength;
char* output;
int i, j, len, inputmax;
/*入力*/
std::getline(std::cin, inputstr);
inputmax = inputstr.size();
input = inputstr.c_str();
onelength = new int[inputmax];
output = new char[inputstr.size() + 100];
/*半角と全角の判定*/
for (i = 0; i<inputmax;) {
len = mozilen_hantei((const unsigned char*)&input[i]);
onelength[i] = len;
for (j = 1; j<len; j++)onelength[i + j] = 0;
if (len <= 0)len = 1;/*無限ループ防止*/
i += len;
}
/*出力文字列の準備*/
len = 0;
for (i = inputmax - 1; i >= 0; i--) {
if (onelength[i]>0) {
for (j = 0; j<onelength[i]; j++) {
output[len + j] = input[i + j];
}
len += onelength[i];
}
}
output[len] = 0;
outputstr = output;
/*メモリ開放*/
delete onelength;
delete output;
/*出力*/
std::cout << outputstr << std::endl;
/*正常終了*/
return 0;
}