一道简单题,想的不到位,做了好久···呵呵一下自己的poor能力···
问题出在F函数中注释部分
想当然认为短的去匹配长的串···
然而反例是
2111
222211
长的匹配短的结果是7
短的匹配长得结果是8
注释掉后就对了···
之前主函数中交换是因为考虑到了如下情况
222
221
如果不交换输出6 交换后输出5
剩下的就是F函数中for的实现了
思路是逐位匹配,如果匹配不了就返回到原来位置+1的地方继续匹配知道 循环终止 继而判断循环因何终止 可得最终结果
//#define LOCAL
#include <map>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
int F(string &S1, string &S2){
string S;
int i,j;
//if(S1.length()<S2.length()) {S=S1; S1=S2; S2=S;}
int flag=0;
int start=0;
for(j=0,i=0; j<S2.length()&&i<S1.length(); ){
int a=S1[i]-'0'; int b=S2[j]-'0';
if(a+b<4){
if(flag==0){
flag=1;
start=i;
}
i++;j++;
}
else {
i=start+1;
start++;
flag=0;
j=0;
}
}//for
int ans=0;
if(j==S2.length())
ans=S1.length();
else
ans=S1.length()+(S2.length()-j);
return ans;
}
int main()
{
#ifdef LOCAL
//freopen("in1.txt","r",stdin);
ifstream cin("in1.txt");
#endif
string S1,S2;
while(cin>>S1>>S2){
int Min=F(S1,S2);
cout<<(Min<F(S2,S1) ? Min : F(S2,S1))<<endl;
}//while
return 0;
}