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碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...
随机推荐
- [Xcode 实际操作]一、博主领进门-(10)Xcode右侧界面介绍
目录:[Swift]Xcode实际操作 本文将演示Xcode右侧界面介绍. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 右上角第三个[辅助编辑器]按钮,将代码切 ...
- foreach循环报NPE空指针异常
前言 最近debug时忽然发现,如果一个集合赋值为null,那么对该集合进行foreach循环(也叫增强for循环)时,会报NPE(即空指针异常NullPointerException). 代码如下: ...
- java排序之冒泡排序
代码: package com.cn.algorithm_arithmetic算法; /** * 本程序记录了经典排序算法之冒泡排序 * @author Administrator * */ publ ...
- Codeforces Round #541 (Div. 2) C.Birthday
链接:https://codeforces.com/contest/1131/problem/C 题意: 求给的n个数,相邻差值最小的排列方式.1-n相邻. 思路: sort后隔一个取一个,取到底后再 ...
- Android 流量测试方法
流量测试怎么测?下面总结了几个方法: 一.通过pid获取流量 > 1.获取应用的pid adb shell ps | grep packagename 2.通过pid获取该进程的流量信息 adb ...
- c/c++学习系列之内存对齐
1.C++内存对齐规则 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你 ...
- C51 笔记
一 关于宏常量的长度:C51中定义一个常数宏(默认是16位的),如果用宏表示一个32位的宏而不加'L'标志的话就会出错.如 #define BLOCK_A_BASEADDR 18*64*1024 / ...
- java transient关键字作用,使用场景
transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...
- jsp动态图片页面基础
1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第七天(非原创)
文章大纲 一.课程介绍二.Redis基础实战三.Redis之高可用.集群.云平台搭建实战四.淘淘商城Jedis整合spring五.项目源码与资料下载六.参考文章 一.课程介绍 一共14天课程(1) ...