两道相似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基础 ...
随机推荐
- .NET(Core)应用程序模型及未来
- linux线程控制&线程分离
线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- CentOS下apache绑定域名
本文主要介绍在CentOS下apache绑定域名以及apache绑定多个域名,首先要找到apache的配置文件httpd.conf的位置.CentOS操作系统一般在 /etc/httpd/conf 下 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- android 永不关闭toast
Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列;那么有些时候需要这个Toast信息提示框长时间显示,直到需要关闭它时通过代码来控制,而不是让系统自动来关闭To ...
- Android项目实战(十):自定义倒计时的TextView
项目总结 -------------------------------------------------------------------------------------------- 有这 ...
- HBase体系结构剖析
本文出自:http://wuyudong.com/archives/154 在上篇文章<HBase简介>中,已经提到过,HBase中的Table中的所有行都按照row key的字典序排列, ...
- 【读书笔记】iOS-查看一个软件ipa包的内容
一,打开itunes----->我的iPhone应用程序. 二,右键点击app---->在Finder中显示---->出现下图所示界面. 三,将上图中的ipa包拷贝到桌面,如下图所示 ...
- java运算符总结
1.算数运算符:+.-.*./.%(加减乘除取余) 2.自增自减:++.-- 3.赋值运算符:=.+=.-=.*=./= 4.关系运算符:>.<.>=.<=.==.!= 逻辑运 ...