UVa1588 解题报告
这道题可以直接模拟。因为齿轮是条状,高度只有两种,所以只要匹配字符串就可以了。两个字符串的相交区域计算高度相加是不是大于3,小于3便是合法的配对。处理A、B两个字符串时枚举B在总长中的起点和B的自身下标后进行匹配即可。以A的0下标为原点,B的0下标设为起点,这样B的起点从负数-B.length()开始,一直到A.length()+B.length(),然后B在A上左右滑动,寻找最小合法解。
预处理将A设置为最长的字符串,注意边界处理,即是A、B等长时。
以下是代码(可直接AC):
#include <iostream>
#include <string>
#include <cmath>
using std::cin;
using std::cout;
using std::string;
int main()
{
string a,b;
int min=999999;
int in=0;
while(cin>>a>>b)
{
int len1=a.length(),len2=b.length();
min=999999;
in=0;
if(len1<len2)
{
string tmp;
tmp=a;
a=b;
b=tmp;
len1=a.length();
len2=b.length();
}
for(int i=-len2;i<len1+len2-1;i++)//枚举起点
{
int ok=1;//是否合法的标记
for(int j=0;j<len2;j++)
if(j+i>=0&&i+j<len1)//重叠区域才进行判断合法性
if(a[i+j]-'0'+b[j]-'0'>3)
ok=0;
if(ok&&i<0)//B在A左方
min=std::min(-i+len1,min);
if(ok&&i>len1-len2)//B在A右方
min=std::min(len2+i,min);
if(ok&&i>=0&&i+len2<=len1)//B与A完全重叠,合法就直接输出,不会有更小解
{
in=1;
break;
}
}
if(in)
cout<<len1<<'\n';
else
cout<<min<<'\n';
}
return 0;
}