题解 AT2162 【Prefix and Suffix】

· · 题解

经过2^3次修改,终于AC了。

第一次那么长的AT代码

思路:有主要下面几种情况

代码:

#include<bits/stdc++.h>//头文件
using namespace std;
int l;//长度
string q,h,e1,e2,b1,b2;//前后缀和备份
int cz(string a,string b){//查(c)找(z)
    int j,maxx=-1;
    for(int i=0;i<b.length();i++){//从第一个开始找
        j=0;//记得清零
        while(b[i+j]==a[j]){//查找直到不相等
            j++;//相等的++
        }
        maxx=max(maxx,j);//我只要最大的
    }
    return maxx;//返回最大的
    /*
    这里是查找出最大的相同的字符长度
    用于后面判断
    */
}
int main(){
    cin>>l>>q>>h;
    e1=q;e2=h;//用于删字符
    b1=q;b2=h;//备份
    reverse(e1.begin(),e1.end());//先把前缀翻转
    reverse(q.begin(),q.end());//这个也要翻转
    for(int i=0;i<q.length();i++){//开始判断相同的
        if(e1[0]==e2[0]){//从前面判断是否相同
            e1.erase(0,1);//删掉第一位
            e2.erase(0,1);//你也是
            q.erase(0,1);//还有你
        }
    }
    /*
    这个for结束后
    可以把相同的字符去掉
    例如把abc,cab的c去掉。
    */
    if(b2==b1){//特判2个字符串是否相等
        cout<<b1.length()<<endl;//如果相等就输出
    }
    else{//否则
        if(cz(b2,b1)>0){//如果相等的字符在2个以上,例如:abc,bcd
            cout<<b1.length()*2-cz(b2,b1)<<endl;//输出长度*2减去相等的部分
        }
        else{//否则
            cout<<q.length()+h.length()<<endl;//没有相同部分
        }   
    }
    //cout<<"cf:"<<cz(b2,b1)<<endl; //不要在意这些细节
    return 0;//完美结束
}