两道相似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基础 ...
随机推荐
- svn 大全
环境:Win7 32 bit SVN简介:程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是一 ...
- python函数和常用模块(二),Day4
内置函数2 装饰器 字符串格式化 生成器 迭代器 递归 模块 序列化相关 time模块 datetime模块 内置函数2 callable() # 是否可以被执行,是否可以被调用 chr() # as ...
- 基于java的socket编程
#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...
- 求Mac 的adt插件!
搞了半天原来ADT Mac和win是通用的安装方法也相同! 自己配环境! 下载一个Eclipse,然后安装就行! dns:203.195.223.190 这个DNS可以连上谷歌的服务器(只限学习使用) ...
- Android5.0新特性——全新的动画(animation)
全新的动画 在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android ...
- playframework文档未提及,但你能做的事
这里记录一些play!框架的文档未提及,但是可以做的一些事playframe版本1.1 1.application.conf文件可以拆分可以把application.conf文件拆成多个,需要在app ...
- ASP.NET Url重写
新建一个类,并实现IHttpModule接口 实现接口,在Init方法中处理请求,在请求方法中实现具体的Url重写操作 补充Url重写方法,通过 Request的Path对象获取请求文件路径,并根据请 ...
- [leetcode] Count Primes
Count Primes Description: Count the number of prime numbers less than a non-negative number, n click ...
- 【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】
在上一篇专题文章[原]iOSCoreAnimation动画系列教程(一):CABasicAnimation[包会]中我们学习了iOS核心动画CoreAnimation中CABasicAnimation ...
- OC-分类
1.不能再分类里面添加属性, 只能添加方法. 2.如果在分类里面使用@property,那么他只生成sette,getter的声明而没有实现. 3.如在在分类中写了与本类同名的方法,优先调用分类里面的 ...