题解 AT2162 【Prefix and Suffix】
经过
第一次那么长的AT代码
思路:有主要下面几种情况
-
3\,abc\,bcd\qquad Ans:4 -
3\,abc\,abc\qquad Ans:3 -
3\,abc\,cba\qquad Ans:5 解决方法详见代码部分
代码:
#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;//完美结束
}