[POJ3157]Java vs C++

翻译

J a v a 语言转为 C + +

改为 C + + 只要将 J a v a 中的大写字母前加下划线,及将大写字母改为小写。

改为 J a v a c 的下划线去掉,将下划线后的字母改为大写。

如果输出 E r r o r ! :

首字母大写,下划线,有 2 个下划线同时,末尾出现下划线

J a v a 没有下划线, C + + 没有大写字母。

思路

这道题非法情况特多,可以先检测所有的非法情况,然后放心处理即可。对于里面那些恶心的操作,我竟然第一个就想到了 v e c t o r ,里面有个坑,那就是如果你不 J a v a > C + + C + + > J a v a 放在一起的话, C + + > J a v a 不会成功(因为你刚转完又被 J a v a > C + + 判断到然后覆盖了)。为此我样例都没过,然后解决了一次提交,过了!!!(加了许多的玄学优化)。

然后得到了:

  • 全班程序最短

  • 全班做法最特殊(只有我一个用 v e c t o r ,貌似在网上还没看见这么做的)

  • 全班唯一二个提交一次就 A C

  • 全班运行第二快, 32 M S (%%%第一卡常dalao)

Code

#include<iostream>
#include<vector>
#include<cstdlib>
#include<cstring>
using namespace std;
vector<char>s;//vector大法好
int upper=0,under=0;
inline void Error()
{
    cout<<"Error!"<<endl;
    exit(0);
}
inline void first()
{
    for(register int i=1; i<s.size(); ++i)
    {
        if(s[i]=='_')
        {
            if(s[i-1]=='_')//连续_
                Error();
            else
                under++;
        }
        if(isupper(s[i]))
            upper++;
    }
    if(upper&&under)//Java与C++冲突
        Error();
    if(isupper(s[0])||s[0]=='_'||s[s.size()-1]=='_')//开头结尾的问题
        Error();
}
int main()
{
    ios::sync_with_stdio(false);
    char c;
    while(cin>>c)
        s.push_back(c);//输入
    first();//查找错误情况
    for(register int i=1; i<s.size(); ++i)//放心处理
        if(s[i]=='_')
        {
            s.erase(s.begin()+i);
            s[i]=toupper(s[i]);
        }
        else if(isupper(s[i])&&upper)//枚举大写更快,upper是特判,如果出现了大写说明是Java
        {
            s[i]=tolower(s[i]);
            s.insert(s.begin()+i,'_');
        }
    for(register int i=0; i<s.size(); i++)//输出
        cout<<s[i];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/81840693
今日推荐