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碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...
随机推荐
- uoj#267. 【清华集训2016】魔法小程序(乱搞)
传送门 感觉很像FFT的过程的说-- 先来考虑\(b\)如何转化成\(c\),那么只要通过它的逆过程就可以了 首先,我们称"魔法"为比较两个数的字典序,记\(x=a_0\),那么把 ...
- Python学习 Part2:深入Python函数定义
在Python中,可以定义包含若干参数的函数,这里有几种可用的形式,也可以混合使用: 1. 默认参数 最常用的一种形式是为一个或多个参数指定默认值. >>> def ask_ok(p ...
- Spark 学习(三) maven 编译spark 源码
spark 源码编译 scala 版本2.11.4 os:ubuntu 14.04 64位 memery 3G spark :1.1.0 下载源码后解压 1 准备环境,安装jdk和scala,具体参考 ...
- Shiro 权限管理框架
一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...
- plt
设定X,Y轴的长度以及刻度的方法. import numpy as np import matplotlib.pyplot as plt data = np.arange(0,1.1,0.01) pl ...
- DB2 - 编目的解释
编目(Catalog),是在本地或远程建立客户端到服务器的数据库连接的过程.其目的在于获取编目信息,即生成用来访问数据库的目录.系统数据库目录包含一个列表和指针,通过目录可以使 DB2 能够找到已知的 ...
- Android Activity生命周期(转)
转自 http://blog.csdn.net/android_tutor/article/details/5772285
- SVG图像学习
参考阮一峰老师: SVG 图像入门教程 基本使用 可以直接放入到html中 <body> <svg viewBox="0 0 800 600" > < ...
- vue echarts 大小自适应
窗口大小时候 ,echarts图自适应 在创建图表的方法中直接,用resize方法 let myChart=this.$refs.myChart; let mainChart = echarts.in ...
- iis日志存放位置 及 查看方法
IIS:控制面板--管理工具--internet信息服务 网站的IIS日志是在空间里面看的.要登陆到空间里面的一个IIS日志里面看.IIS日志一般都很大的.看会有点.. 一.应用程序日志.安全日志.系 ...