您的位置:首页 > 其它

POJ 1580 && HDU 1306 String Matching(水~)

2015-08-25 10:38 507 查看
Description

现定义两个仅由大写字母组成的字符串的匹配程度如下:将某一字符串的首字符与另一字符串的某一字符对齐,然后后面的字符也一一对齐,直至某一字符串的串尾为止。对于每一组对齐的两个字符,若这两个字符相等,则计数。最后计算这个计数的2倍,与两串总长度的最大比值

Input

多组用例,每组用例占一行,包括两个字符串,以-1结束输入

Output

对于每组用例,输出两个字符串的最大匹配数与两串总长度的比值

Sample Input

CAR CART

TURKEY CHICKEN

MONEY POVERTY

ROUGH PESKY

A A

-1

Sample Output

appx(CAR,CART) = 6/7

appx(TURKEY,CHICKEN) = 4/13

appx(MONEY,POVERTY) = 1/3

appx(ROUGH,PESKY) = 0

appx(A,A) = 1

Solution

简单字符串处理,暴力枚举两串匹配的首字母,不断更新最大匹配值即可,最后的答案需要对最大匹配值和两串总长进行辗转相除

Code

#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
int gcd(int x,int y)
{
if(x%y!=0)
return gcd(y,x%y);
return y;
}
int main()
{
int i,j,k,len1,len2,a,b,res,max;
char c,c1[1000],c2[1000];
while(1)
{
scanf("%s%s",c1,c2);
if(strcmp(c1,"-1")==0)//输入结束条件
break;
len1=strlen(c1);
len2=strlen(c2);
max=0;//最大匹配数
for(i=0;i<len1;i++)//枚举两串首字母
for(j=0;j<len2;j++)
{
res=0;//每次记录匹配数前初始化为0
for(k=0;k<min(len1-i,len2-j);k++)
if(c1[k+i]==c2[k+j])
res++;
max=max(max,res);
}
if(max==0||2*max-len1-len2==0)//没有匹配或者完全匹配则不用辗转相除
printf("appx(%s,%s) = %d\n",c1,c2,2*max/(len1+len2));
else
{
a=2*max;
b=len1+len2;
i=gcd(a,b);//辗转相除
a/=i;
b/=i;
printf("appx(%s,%s) = %d/%d\n",c1,c2,a,b);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: