pta(估值一亿的AI核心代码 (20point(s)))(STL)

题意:

 

 

思路:

  运用STL中的find、erase、replace方法还有string的迭代器模拟。注意的是规则3、4、5、6是对原文而言,而不是对上一步规则的结果而言。但在我的理解中,题意有点问题,根据样例可以发现规则4并不是在原文基础上实施的,而是在规则3的结果基础上实施的。

 

AC code:

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;

typedef string::iterator IT;
int n;
string s1,s2;
char c;

bool isBD(char c){
    if(c>='a'&&c<='z') return false;
    if(c>='A'&&c<='Z') return false;
    if(c>='0'&&c<='9') return false;
    if(c==' ') return false;
    return true;
}

bool check(int l,int r){
    int f1=0,f2=0;
    if(!l||s1[l-1]==' '||isBD(s1[l-1])) f1=1;
    if(r==s1.length()-1||s1[r+1]==' '||isBD(s1[r+1])) f2=1;
    return f1&&f2;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin>>n;
    cin.get();
    while(n--){
        getline(cin,s1);
        cout<<s1<<endl;

        for(IT it=s1.begin();it!=s1.end();++it){
            if((*it)==' '){
                IT it2=it;
                it2++;
                while(it2!=s1.end()&&(*it2)==' ')
                    s1.erase(it2);
            }
        }
        IT it=s1.begin();
        if((*it)==' ') s1.erase(it);
        it=s1.end();
        --it;
        if((*it)==' ') s1.erase(it);
        for(IT it=s1.begin();it!=s1.end();++it)
            if(isBD((*it))){
                if(it==s1.begin()) continue;
                IT it2=it;
                --it2;
                if((*it2)==' ') s1.erase(it2),it=it2;
            }
        
        for(IT it=s1.begin();it!=s1.end();++it)
            if((*it)>='A'&&(*it)<='Z'&&(*it)!='I')
                (*it)=(*it)+'a'-'A';
        s2=s1;

        string f1="can you",r1="I can",rr1="xxxxx";
        int p=0;
        while(p<s1.length()&&(p=s1.find(f1,p))!=string::npos){
            if(check(p,p+7-1)){
                s1=s1.replace(p,7,rr1);
                s2=s2.replace(p,7,r1);
                p+=5;
            }
            else{
                p+=7;
            }
        }
        string f2="could you",r2="I could",rr2="xxxxxxx";
        p=0;
        while(p<s1.length()&&(p=s1.find(f2,p))!=string::npos){
            if(check(p,p+9-1)){
                s1=s1.replace(p,9,rr2);
                s2=s2.replace(p,9,r2);
                p+=7;
            }
            else{
                p+=9;
            }
        }
    
        string f3="I",r3="you",rr3="xxx";
        p=0;
        while(p<s1.length()&&(p=s1.find(f3,p))!=string::npos){
            if(check(p,p+1-1)){
                s1=s1.replace(p,1,rr3);
                s2=s2.replace(p,1,r3);
                p+=3;
            }
            else{
                p+=1;
            }
        }
    
        string f4="me",r4="you",rr4="xxx";
        p=0;
        while(p<s1.length()&&(p=s1.find(f4,p))!=string::npos){
            if(check(p,p+2-1)){
                s1=s1.replace(p,2,rr4);
                s2=s2.replace(p,2,r4);
                p+=3;
            }
            else{
                p+=2;
            }
        }
        
        for(IT it=s2.begin();it!=s2.end();++it)
            if((*it)=='?')
                (*it)='!';

        cout<<"AI: "<<s2<<endl;

    }
    return 0;
}

 

posted @ 2020-03-21 18:31  Frank__Chen  阅读(673)  评论(0编辑  收藏  举报