[转]编程之美 2013 全国挑战赛 初赛第一场 题目二 相似字符串
2013-04-14 23:56
447 查看
题目二 相似字符串
时间限制: 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
样例输入
3 0123456789 321 010203040506070809 404 20121221 211
样例输出
Case #1: 2 Case #2: 1 Case #3: 1
解题思路
这道题其实不复杂,结果我很蛋疼的用了一个字符串近似匹配的 DP 算法,结果果然悲剧了……在这里就只好读读大神们的代码,看看有什么给力的解法。首先设两个字符串分别为 s1 和 s2,它们的长度为 m 和 n,其中 m ≥n。
最简单的方法是直接暴力字符串匹配,就是尝试将每个 s1i…i+n 和 s20…n 进行匹配(排名第二的 Tripod2K 就是这么过的),不过需要注意如果距离已经大于当前的最小距离了,就不必继续匹配下去了,否则是会悲剧的。核心算法为:
View Code
View Code
1 //source here 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 int num[10][60000],ans[60000]; 6 int main() 7 { 8 int T,n,i,k,j,s,l1,l2,anss,t; 9 string s1,s2; 10 cin>>T; 11 t=1; 12 while (T>=t) 13 { 14 ++t; 15 cin>>s1;cin>>s2; 16 l1=s1.length(); l2=s2.length(); 17 for (i=0;i<10;++i) num[i][0]=0; 18 for (i=0;i<l1;++i) 19 { 20 k=s1[i]-'0'; 21 ++num[k][0]; 22 num[k][num[k][0]]=i; 23 ans[i]=0; 24 } 25 for (i=0;i<l2;++i) 26 { 27 k=s2[i]-'0'; 28 for (j=1;j<=num[k][0];++j) 29 { 30 if (num[k][j]-i>=0) 31 ans[num[k][j]-i]++; 32 } 33 } 34 anss=0; 35 for (i=0;i<l1-l2+1;++i) 36 if (ans[i]>anss) anss=ans[i]; 37 anss=l2-anss; 38 cout<<"Case #"<<t-1<<": "<<anss<<endl; 39 } 40 return 0; 41 }
题目三是一个好复杂的搜索,我根本没仔细看,题目一我也没搞明白怎么个是最优策略。
相关文章推荐
- 编程之美 2013 全国挑战赛 初赛第一场 题目二 相似字符串
- 编程之美 2013 全国挑战赛 初赛第一场 题目二 相似字符串
- 编程之美 2013 全国挑战赛 初赛第一场 题目二 相似字符串
- 2013编程之美全国挑战赛初赛第一场 第二题 相似字符串
- 编程之美 2013 全国挑战赛 资格赛 题目三 树上的三角形
- [转]编程之美 2013 全国挑战赛 资格赛 题目一 传话游戏
- [转]编程之美 2013 全国挑战赛 资格赛 题目二 长方形
- [转]编程之美 2013 全国挑战赛 资格赛 题目三 树上的三角形
- 编程之美 2013 全国挑战赛 资格赛 题目二 长方形
- 2013编程之美全国挑战赛 初赛第一场 题目2
- 编程之美 2013 全国挑战赛 资格赛 题目三 树上的三角形
- 2013编程之美全国挑战赛 初赛第一场 题目2
- 2013编程之美全国挑战赛---相似字符串
- 编程之美初赛第一场 题目3 : 活动中心
- 编程之美挑战赛初赛第一场题目1
- 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记I hdu 4508--- 完全背包
- 微软2014编程之美初赛第一场——题目2 : 树
- 编程之美初赛第一场 题目1 : 焦距
- 2013 编程之美挑战赛 相似字符串
- 编程之美初赛第一场 题目2 : 树