Blog·Tanky WooABOUTRSS

HDOJ 1736 美观化文字

05 Aug 2010
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

题目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=1736


粗略一看以为是要用wchar_t和wcin,wcout输入输出,可是看来错了。。。。

在题目看面有这么一个Hint:

你可以认为所有中文字符由两个字节组成,首字节的ASCII值都大于127(也可以理解为signed char型小于0) 意思就是直接用char保存,当检测到第一个是小于0时,再检测第二个,把把第一个和第二个组成中文字。

这里不光考察了这些,还考察了细心。

给好多一直WA的朋友一组数据大家就知道自己为何WA了(对于大部分应该都是这里错了):

“ddddd"ddddd"ddddd”(输入包括第一个和最后一个双引号,第一个和最后一个是中文的引号,中间2个是英文的引号)

大家看懂没?第一个字符是中文的"“"

最后一个也是中午的"”"

那么输出应该是: “ddddd”ddddd“ddddd”

大家看看自己是不是这里只考虑了遇到" " "或 " " " 才变的。


OK,给代码了:

 

 

//  Accepted 1736 0MS 1208K 1464 B C++ Tanky Woo 

#include 
#include 
using namespace std;

int main()
{
 //wchar_t ch;
 //wcin.imbue(locale("chs"));   //这里不能用wchar_t来输入输出汉字

 //wcout.imbue(locale("chs"));
 int flag = 0;  // 0表示左边,1表示右边
 char article[1000000];
    while(gets(article) != NULL)
    {
     flag = 0;
     int len = strlen(article);
      for(int i=0; i<len; ++i)
   { 
      string tmp ;
   tmp =  tmp+article[i] + article[i+1];   // 这里判断是否遇到了"“"或"”"
          if(tmp=="“" || tmp=="”")
              flag = !flag;  
   if(article[i] == ',')
               cout << ",";
        else if(article[i] == '.')
                  cout << "。";
           else if(article[i] == '!')
                 cout << "!";
           else if(article[i] == '"')
           {
                if(flag == 0)
                    cout << "“";
                else
                    cout << "”";
                flag = !flag;
            }
            else if(article[i] == '<' && article[i+1]=='<')
            {
                  cout << "《";
                  i++;
            }
            else if(article[i] == '>' && article[i+1]=='>')
            {
                  cout << "》";
                  i++;
            }
             else if(article[i] == '?')
                 cout << "?";
             else
                  cout << article[i];
  }
  cout << endl;
    }
 return 0;
}