2013编程之美全国挑战赛 初赛第一场 题目2

来源:互联网 发布:xshell linux版 编辑:程序博客网 时间:2024/04/30 05:00

时间限制: 4000ms 内存限制: 256MB


描述

对于两个长度相等的字符串,我们定义其距离为对应位置不同的字符数量,同时我们认为距离越近的字符串越相似。例如,“0123”和“0000”的距离为 3,“0123”和“0213”的距离则为 2,所以与“0000”相比,“0213”和“0123”最相似。

现在给定两个字符串 S1 和 S2,其中 S2 的长度不大于 S1。请在 S1 中寻找一个与 S2 长度相同的子串,使得距离最小。

输入

输入包括多组数据。第一行是整数 T,表示有多少组测试数据。每组测试数据恰好占两行,第一行为字符串 S1,第二行为 S2。所有字符串都只包括“0”到“9”的字符。

输出

对于每组测试数据,单独输出一行“Case #c: d”。其中,c 表示测试数据的编号(从 1 开始),d 表示找到的子串的最小距离。

数据范围

1 ≤ T ≤ 100

小数据:字符串长度不超过 1000

大数据:字符串长度不超过 50000

样例输入
3012345678932101020304050607080940420121221211
样例输出
Case #1: 2Case #2: 1Case #3: 1

暴力过了小数据:

#include <iostream>#include <cstring>#include <cstdio>#include <string>char s1[50000],s2[50000];using namespace std;int main(){    int t,N,CA,CB,Case=1;    scanf("%d",&t);    getchar();    while(t--)    {        gets(s1);        gets(s2);        int len1,len2;        len1 = strlen(s1);        len2 = strlen(s2);        int maxx = 0;        for(int i = 0; i <= len1-len2; i++)        {            int ans = 0;            for(int j = 0; j < len2; j++)            {                if(s1[i+j]==s2[j])                    ans++;            }            if(ans > maxx)            {                maxx = ans;            }        }        printf("Case #%d: %d\n",Case++,len2-maxx);    }    return 0;}



原创粉丝点击