两道相似KMP题
1.POJ 3450 Coporate Identity
这两题的解法都是枚举子串,然后匹配,像这种题目以后可以不用KMP来做,直接字符串自带的strstr函数搞定,如果字符串未出现,该函数返回NULL。
下面贴出其比较。
代码:(KMP版)(1360ms 888KB)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 4007 char ans[],str[];
char ss[N][],tt[];
int next[]; void getnext(char *ss)
{
int m = strlen(ss);
next[] = -;
int i = ,j = -;
while(i<m)
{
if(j == - || ss[i] == ss[j])
next[++i] = ++j;
else
j = next[j];
}
} int kmp(char *ss,char *tt)
{
int n = strlen(ss);
int m = strlen(tt);
getnext(tt);
int i = -,j = -;
while(i<n && j<m)
{
if(j == - || ss[i] == tt[j])
i++,j++;
else
j = next[j];
}
if(j == m)
return ;
return ;
} int main()
{
int n,i,len,j,k,lengh;
while(scanf("%d",&n)!=EOF && n)
{
for(i=;i<n;i++)
scanf("%s",ss[i]);
lengh = strlen(ss[]);
ans[] = '\0';
for(len=;len<=lengh;len++) //枚举长度
{
for(i=;i<=lengh-len;i++) //枚举起点
{
for(k=,j=i;j<i+len;j++) //取出此字串
str[k++] = ss[][j];
str[k] = '\0';
for(j=;j<n;j++)
{
if(!kmp(ss[j],str))
break;
}
if(j == n)
{
if(strlen(ans) == len && strcmp(ans,str) > )
strcpy(ans,str);
if(strlen(ans) < len)
strcpy(ans,str);
}
}
}
if(ans[] == '\0')
cout<<"IDENTITY LOST\n";
else
cout<<ans<<endl;
}
return ;
}
代码:(strstr函数版)(454ms 912KB)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 4007 char ans[],str[];
char ss[N][],tt[];
int main()
{
int n,i,len,j,k,lengh;
while(scanf("%d",&n)!=EOF && n)
{
for(i=;i<n;i++)
scanf("%s",ss[i]);
lengh = strlen(ss[]);
ans[] = '\0';
for(len=;len<=lengh;len++) //枚举长度
{
for(i=;i<=lengh-len;i++) //枚举起点
{
for(k=,j=i;j<i+len;j++) //取出此字串
str[k++] = ss[][j];
str[k] = '\0';
for(j=;j<n;j++)
{
if(strstr(ss[j],str) == NULL)
break;
}
if(j == n)
{
if(strlen(ans) == len && strcmp(ans,str) > )
strcpy(ans,str);
if(strlen(ans) < len)
strcpy(ans,str);
}
}
}
if(ans[] == '\0')
cout<<"IDENTITY LOST\n";
else
cout<<ans<<endl;
}
return ;
}
2.POJ 3080 Blue Jeans
代码:(KMP版)(32ms 684KB)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 4007 char ans[],str[];
char ss[][],tt[];
int next[]; void getnext(char *ss)
{
int m = strlen(ss);
next[] = -;
int i = ,j = -;
while(i<m)
{
if(j == - || ss[i] == ss[j])
next[++i] = ++j;
else
j = next[j];
}
} int kmp(char *ss,char *tt)
{
int n = strlen(ss);
int m = strlen(tt);
getnext(tt);
int i = -,j = -;
while(i<n && j<m)
{
if(j == - || ss[i] == tt[j])
i++,j++;
else
j = next[j];
}
if(j == m)
return ;
return ;
} int main()
{
int n,i,len,j,k,lengh,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%s",ss[i]);
lengh = strlen(ss[]);
ans[] = '\0';
for(len=;len<=lengh;len++) //枚举长度
{
for(i=;i<=lengh-len;i++) //枚举起点
{
for(k=,j=i;j<i+len;j++) //取出此字串
str[k++] = ss[][j];
str[k] = '\0';
for(j=;j<n;j++)
{
if(!kmp(ss[j],str))
break;
}
if(j == n)
{
if(strlen(ans) == len && strcmp(ans,str) > )
strcpy(ans,str);
if(strlen(ans) < len)
strcpy(ans,str);
}
}
}
if(ans[] == '\0' || strlen(ans) < )
cout<<"no significant commonalities\n";
else
cout<<ans<<endl;
}
return ;
}
代码:(strstr函数版)(0ms 700KB)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 4007 char ans[],str[];
char ss[][]; int main()
{
int n,i,len,j,k,lengh,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%s",ss[i]);
lengh = strlen(ss[]);
ans[] = '\0';
for(len=;len<=lengh;len++) //枚举长度
{
for(i=;i<=lengh-len;i++) //枚举起点
{
for(k=,j=i;j<i+len;j++) //取出此字串
str[k++] = ss[][j];
str[k] = '\0';
for(j=;j<n;j++)
{
if(strstr(ss[j],str) == NULL)
break;
}
if(j == n)
{
if(strlen(ans) == len && strcmp(ans,str) > )
strcpy(ans,str);
if(strlen(ans) < len)
strcpy(ans,str);
}
}
}
if(ans[] == '\0' || strlen(ans) < )
cout<<"no significant commonalities\n";
else
cout<<ans<<endl;
}
return ;
}
两道相似KMP题的更多相关文章
- FJOI2020 的两道组合计数题
最近细品了 FJOI2020 的两道计数题,感觉抛开数据范围不清还卡常不谈里面的组合计数技巧还是挺不错的.由于这两道题都基于卡特兰数的拓展,所以我们把它们一并研究掉. 首先是 D1T3 ,先给出简要题 ...
- 又一道简单题&&Ladygod(两道思维水题)
Ladygod Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- 一道cf水题再加两道紫薯题的感悟
. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...
- 算法(JAVA)----两道小小课后题
LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快的算法). 1.编写一个程序解决选择问题.令 ...
- JAVA算法两道
算法(JAVA)----两道小小课后题 LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快 ...
- 两种KMP题+KMP模版整理
最近稍微看了下KMP,不是很懂他们大神的A题姿势,但是模版总该还是要去学的. 其中next数组的求法有两处区别. 第一种:求主串中模式串的个数.HDU2087 剪花布条和HDU4847 Wow! Su ...
- 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester
这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...
- 两道人数多,课程少,query多的题
#每天进步一点点# 来两道很相似的题目~ (智商啊智商.....) hihoCoder #1236:Scores (简单的分桶法+bitset) 2015 Beijing Online的最后一题.题目 ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
随机推荐
- PHP学习笔记:MySQL数据库的操纵
Update语句 Update 表名 set 字段1=值1, 字段2=值2 where 条件 练习: 把用户名带 ‘小’的人的密码设置为123456@ 语句:UPDATE crm_user SE ...
- Follow me to learn how to use mvc template
Introduction After having gone through many project: Project A Project B Project C I start to write ...
- 自制html5塔防游戏
这是一款由html5里的canvas和普通html元素结合的小游戏,游戏比较简单单一.主要是以建塔,防御为主.下面是游戏的一张截图: 这里是游戏的地址,直接去玩下吧:http://www.lovewe ...
- javascript中||和&&代替if
首先,我们来看一段代码: ; ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } else { ad ...
- Uploading Files in SharePoint 2013 using CSOM and REST
http://www.shillier.com/archive/2013/03/26/uploading-files-in-sharepoint-2013-using-csom-and-rest.as ...
- Android项目实战(十):自定义倒计时的TextView
项目总结 -------------------------------------------------------------------------------------------- 有这 ...
- 【原】log4cplus使用说明
网上关于开源日志工具log4cplus的说明有很多,但大多略显复杂,本文主要从实用的角度,介绍一种最简单而且又实用的方法.本文的方法已经足够满足实际工程中的使用需求,而且不需要很复杂的流程,可以实现. ...
- IOS之KVC和KVO(未完待续)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- IOS之UI--小实例项目--添加商品和商品名(纯代码终结版)
前言:这个小实例项目是完完全全以MJ视频传授的优化方案一步一个思路从零开始敲出代码的,而且每一步都有思路,都有逻辑所以然.敲代码讲究思路,我个人不建议记忆太多东西,反正我记性很差的. 小贴士:文章末尾 ...
- android intent 5.1
1.intent 6 items action, data(uri &type),Component name,Extras,flags 2.data---uri & type 不管使 ...