codeforces 25 E Test KMP
2016-03-28 13:04
405 查看
题意:求一个最短字符串包含所给的三个子串,输出最短长度
思路:用KMP求出任意两个子串的前缀和后缀公共部分的最大长度
思路:用KMP求出任意两个子串的前缀和后缀公共部分的最大长度
#include <cstdio> #include <cmath> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int len[4],d[4][4]; char s[4][200005]; int Next[300005]; int KMP(char s[],int len) { int n=strlen(s),i,j; memset(Next,0,sizeof(Next)); for(i=1;i<n;i++) { j=Next[i-1]; while(j>0&&s[i]!=s[j]) j=Next[j-1]; if(s[i]==s[j]) j++; Next[i]=j; if(j==len) return len; } return Next[n-1]; } int main() { int i,j,k,m,n,ans; while(~scanf(" %s",s[1])) { memset(d,0,sizeof(d)); scanf(" %s",s[2]); scanf(" %s",s[3]); len[1]=strlen(s[1]); len[2]=strlen(s[2]); len[3]=strlen(s[3]); for(i=1;i<=3;i++) { for(j=1;j<=3;j++) { if(i==j) continue; memset(s[0],0,sizeof(s[0])); strcpy(s[0],s[i]); s[0][len[i]]='#'; strcat(s[0],s[j]); d[i][j]=KMP(s[0],len[i]); } } ans=999999999; for(i=1;i<=3;i++) { for(j=1;j<=3;j++) { for(k=1;k<=3;k++) { if(i==j||i==k||j==k) continue; int tp=len[i]+len[j]+len[k]-d[i][j]; if(d[i][j]==len[i]) tp-=d[k][j]; else tp-=d[k][i]; ans=min(ans,tp); } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 两个APP共享AccountManager管理的账号
- RotateImageView 旋转的ImageView
- 字体变大变小
- 彻底关闭Pycharm拼写检查
- 建议
- 进制转换
- Android的快速入门(66期第一天)
- webvr技术之three.js
- java 继承多个接口
- 不用一句java代码就可以实现指示器tabhost,indicator
- 大数据并发问题
- Object-C 中 的重要类型
- (转)C++语言的15个晦涩特性
- Linux中grep命令的12个实践例子
- 飛飛(十四)百钱百鸡的问题
- 双系统重装win7和ubuntu修复win7引导方法介绍
- 2016.03.27,英语,《Vocabulary Builder》Unit 06
- python sentence
- 04-树4 是否同一棵二叉搜索树 (25分)
- mysql的索引实现