您的位置:首页 > 其它

QUTOJ 1361 字符串匹配 暴力

2016-11-29 23:19 162 查看

1361: 字符串的匹配

时间限制: 1 Sec 内存限制: 128 MB提交: 37 解决: 12

题目描述

相信大家都做许多的字符串匹配问题了,一天,503集训室的俊哥突然想出了新点子。现在给你两个字符串a,b求最长公共子串。对于是字符串匹配大师的你来说,这个再简单不过了。但是,如果现在你有k次修改机会,每次你都可以选择其中某个串的某个位置。将其修改成任意字符。你需要合理使用这k次修改机会,使得修改后字符串的最长公共子串最长。相信这个对于你来说也很简单。

输入

题目中有多组数据,每组数据的第一行为一个整数k。表示修改次数。输入数据的第二行和第三行是a,b两个字符串。题目保证每个串的长度不超过500。

输出

输出每一行为一个整数,表示修改后的两个串的最长公共子串长度。

样例输入

0abcde
jcdkl
2
aaaaaababa

样例输出

2
5
我邀请赛时一直以为这个最长公共子串都是不连续的,没想到这个题是连续的,这个东西需要根据题目要求来,我还以为是dp呢,结果瞎搞就过;
思路:直接暴力扫两个字符串,这里哪个字符串长没有关系,因为你通过长的去找短的公共的和短的去找长的公共的不影响结果的,
如果比较时候两个字符相等就继续后移,如果不等当K不等于0时则相当于修改一个字符k--,每次遍历过后去最大值即可;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char s1[550],s2[550];
int main()
{
int k,i,j,q1,q2,count,ans;
while(cin>>k)
{
getchar();
ans=-1;
scanf("%s",s1);
scanf("%s",s2);
int len1=strlen(s1);
int len2=strlen(s2);
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)//从每一个起点开始.
{   q1=i;
q2=j;
count=0;
int x=k;
while(q1<len1&&q2<len2)//从起点开始依次往后找.
{
while(q1<len1&&q2<len2&&s1[q1]==s2[q2])
{
q1++;
q2++;
count++;
}
if(x)//修改字符
{  q1++;
q2++;
count++;
x--;
}
else
break;
}
ans=max(ans,count);
}
cout<<ans<<endl;
}
return 0;
}
提交
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm