UVA1588

数据不大,暴力过。纳闷的是长度是1~100,数组开150都不行,必须要200才不会WA。

思路:注意双向匹配。for(int i=0;i<2;i++,swap(str1,str2))。记录两个字符串匹配到的数目,两个长度相加减去匹配到的数目即可。

  匹配过程:b串不动,a串从b串第一个字符开始匹配,可行的话继续向后匹,直到a串匹完;不可行的话在b串上向后推一个。

  到今天才知道,输入字符串之后cin>>str1,不会完全刷新之前的,而仅仅是将其最后一个字符后面的一个字符变成'',其后的如果之前输入过则会保留。

  所以要memset(str,0,sizeof(str)).

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char str1[205],str2[205];
    while(cin>>str1>>str2)
    {
        int ans[2]={300,300};
        for(int k=0;k<2;k++,swap(str1,str2))
        {
            int len1,len2,i=0,j=0,J=0;
            len1=strlen(str1);
            len2=strlen(str2);
            int plen=0;
            while(J<len2)
            {
                j=J,i=0;
                while(i<len1)
                {
                    if(!(str1[i]=='2'&&str2[j]=='2'))
                    {
                        if(str1[i]&&str2[j])    plen++;
                        i++;
                        j++;
                    }
                    else{
                        J++;
                        i=0;
                        plen=0;
                        break;
                    }
                }
                if(i==len1)
                {
                    int a=len1+len2-plen;
                        ans[k]=ans[k]<a?ans[k]:a;
                        break;
                }
            }
            if(ans[k]==300)    ans[k]=len1+len2;
        }
        cout<<min(ans[0],ans[1])<<endl;
        memset(str1,0,sizeof(str1));
        memset(str2,0,sizeof(str2));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/depth/p/5671757.html