POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用
题目:POJ3080 http://poj.org/problem?id=3080
题意:对于输入的文本串,输出最长的公共子串,如果长度相同,输出字典序最小的。
这题数据量很小,用暴力也是16ms,用后缀数组可以到0ms,但我不会XD。
暴力:
#include<cstdio>
#include<cstring>
using namespace std;
char str[][],ans[];
int main(){
int T,n; scanf("%d", &T);
while (T--){
memset(ans,,sizeof(ans));
scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%s", str[i]); for (int i = ; i < strlen(str[]); i++)
for (int j = i + ; j < strlen(str[]); j++){
char s[];//子串
strncpy(s, str[] + i, j - i + );///strncpy
s[j - i + ] = '\0'; int flag = ;
for (int k = ; flag && k < n; k++)
if (strstr(str[k], s) == NULL)
flag = ;
///匹配成功,判长度和字典序
if (flag && (j - i + > strlen(ans) || (j - i + == strlen(ans)&&strcmp(ans, s)>) ) )
strcpy(ans, s);
} if (strlen(ans) < ) puts("no significant commonalities");
else puts(ans);
}
return ;
}
KMP:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[][],ans[];
int next[];
//计算串str的next数组
void getnext(char *str){
int len=strlen(str);
int j=,k=-;
next[]=-;
while(j<len){
if(k==-||str[j]==str[k]) next[++j]=++k;
else k=next[k];
}
} //返回串S中第一次出现串T的开始位置
int KMP(char *S,char *T){
int l1=strlen(S), l2=strlen(T);
int i=,j=;
while(i<l1){
if(j==-||S[i]==T[j])
i++, j++;
else j=next[j];
if(j==l2) return i-l2+;
}
return -;//若一直不匹配则返回-1
} int main(){
int T,n;
scanf("%d", &T);
while(T--){
memset(ans,,sizeof(ans));
scanf("%d", &n);
for(int i=;i<n;i++) scanf("%s", str[i]); for(int i=; i<strlen(str[]); i++)//把第一个串的每一个子串当作模板串,求next数组,并和后面的每一个串去匹配
for(int j=i+; j<strlen(str[]); j++){
char s[];
strncpy(s, str[] + i, j - i + );///strncpy
s[j - i + ] = '\0';
getnext(s); int flag = ;
for(int k = ; flag&&k < n; k++)
if(KMP(str[k], s)==-)
flag = ;
///匹配成功,判长度和字典序
if(flag&& ( strlen(s)>strlen(ans) || ( strlen(s)==strlen(ans)&&strcmp(s, ans)<)))
strcpy(ans, s);
} if(strlen(ans) < ) puts("no significant commonalities");
else puts(ans);
}
return ;
}
题目:POJ3461 http://poj.org/problem?id=3461
题意:求第一个串在第二个串中出现的次数
//求第一个串在第二个串中出现的次数
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 1000050
char s[MAXN],t[MAXN];
int next[MAXN];
void getnext(char *str){
int len=strlen(str);
int j=,k=-;
next[]=-;
while(j<len){
if(k==-||str[j]==str[k]) next[++j]=++k;
else k=next[k];
}
} int KMP(char *S,char *T){//返回S中出现T的次数
int l1=strlen(S), l2=strlen(T);
int ans=,i=,j=;
while(i<l1){
if(j==-||S[i]==T[j])
i++, j++;
else j=next[j];
if(j==l2) ans++;
}
return ans;
}
int main(){
int T; scanf("%d",&T);
while(T--){
scanf("%s%s",t,s);
getnext(t);//获得第一个串的next数组去匹配第二个串
printf("%d\n",KMP(s,t));
}
return ;
}
POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用的更多相关文章
- poj 3080 Blue Jeans (暴力枚举子串+kmp)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- POJ 3080 Blue Jeans (求最长公共字符串)
POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...
- POJ 3080 Blue Jeans 找最长公共子串(暴力模拟+KMP匹配)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20966 Accepted: 9279 Descr ...
- poj 3080 Blue Jeans
点击打开链接 Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10243 Accepted: 434 ...
- POJ 3080 Blue Jeans (字符串处理暴力枚举)
Blue Jeans Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21078 Accepted: ...
- POJ 3080 Blue Jeans(Java暴力)
Blue Jeans [题目链接]Blue Jeans [题目类型]Java暴力 &题意: 就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10 规定: 1. 最长公共 ...
- POJ 3080 Blue Jeans (KMP)
求出公共子序列 要求最长 字典序最小 枚举第一串的所有子串 然后对每一个串做KMP.找到目标子串 学会了 strncpy函数的使用 我已可入灵魂 #include <iostre ...
- POJ - 3080 Blue Jeans 【KMP+暴力】(最大公共字串)
<题目链接> 题目大意: 就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10 限制条件: 1. 最长公共串长度小于3输出 no significant co ...
- poj 3080 Blue Jeans 解题报告
题目链接:http://poj.org/problem?id=3080 该题属于字符串处理中的串模式匹配问题.题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...
随机推荐
- Codevs 3409 搬运礼物
3409 搬运礼物 CodeVS原创 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 小浣熊松松特别喜欢交 ...
- Win7下Intellij开发Scala环境搭建
1.Scala下载并安装 1.Scala的安装时需要依赖JDK的,目前我的电脑上,jdk是已经安装好了,这里就不再说明 2.在地址http://www.scala-lang.org/download/ ...
- Day2课后作业:sed替换程序
#!/usr/bin/env python #_*_conding:utf-8_*_ import sys,os old_file = sys.argv[1] new_file = sys.argv[ ...
- 洛谷1005(dp)
1.不要贪,缩小区间去dp就好. 2.预处理指数. 3.__int128可还行. #include <cstdio> #include <cctype> #include &l ...
- python入门之数据类型之字符串
str方法 name.capitalize() 将name的首字母大写 name.center(20,'*') 将name居中,长度变为20,其余用*填充 name.count('chy') 返回na ...
- linux 打开FTP 功能
http://blog.csdn.net/jay285979220/article/details/62216622 今天在linux上安装完了vsftpd后,使用root账号一直无法登陆到服务器上. ...
- django 模板语言的注释操作
Django在HTML里面书写的模板语言不能使用这种方法注释,这样注释实际依然有效 <!--{% if text %}--> 第一种使用模板标签{% comment %}注释,这是块注释 ...
- 表单辅助函数-form_open()
使用from_open()之前需要装载本辅助函数: $this->load->helper('form'); php===> echo form_open('email/send') ...
- substring和substr,slice和splice
substring 和 substr 这二货都是针对字符串而言的,且都是返回一个副本,而不是在原字符串上直接操作. 上代码: var str = '0123456789'; console.log( ...
- 一张图告诉你,只会NodeJS还远远不够!
NodeJS看似小巧简单,却威力无边,一张图,秒懂!!! 可能很多人还不会安装,但至少已经会了javascript,或者至少会了jquery,那么js还可以干更多的事情!js还可以干更多的事情!js还 ...