题目: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应用的更多相关文章

  1. poj 3080 Blue Jeans (暴力枚举子串+kmp)

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  2. POJ 3080 Blue Jeans (求最长公共字符串)

    POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...

  3. POJ 3080 Blue Jeans 找最长公共子串(暴力模拟+KMP匹配)

    Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20966   Accepted: 9279 Descr ...

  4. poj 3080 Blue Jeans

    点击打开链接 Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10243   Accepted: 434 ...

  5. POJ 3080 Blue Jeans (字符串处理暴力枚举)

    Blue Jeans  Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 21078        Accepted: ...

  6. POJ 3080 Blue Jeans(Java暴力)

    Blue Jeans [题目链接]Blue Jeans [题目类型]Java暴力 &题意: 就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10 规定: 1. 最长公共 ...

  7. POJ 3080 Blue Jeans (KMP)

    求出公共子序列  要求最长  字典序最小 枚举第一串的所有子串   然后对每一个串做KMP.找到目标子串 学会了   strncpy函数的使用   我已可入灵魂 #include <iostre ...

  8. POJ - 3080 Blue Jeans 【KMP+暴力】(最大公共字串)

    <题目链接> 题目大意: 就是求k个长度为60的字符串的最长连续公共子串,2<=k<=10 限制条件: 1.  最长公共串长度小于3输出   no significant co ...

  9. poj 3080 Blue Jeans 解题报告

    题目链接:http://poj.org/problem?id=3080 该题属于字符串处理中的串模式匹配问题.题目要求我们:给出一个DNA碱基序列,输出最长的相同的碱基子序列.(保证在所有的序列中都有 ...

随机推荐

  1. [Xcode 实际操作]一、博主领进门-(10)Xcode右侧界面介绍

    目录:[Swift]Xcode实际操作 本文将演示Xcode右侧界面介绍. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 右上角第三个[辅助编辑器]按钮,将代码切 ...

  2. foreach循环报NPE空指针异常

    前言 最近debug时忽然发现,如果一个集合赋值为null,那么对该集合进行foreach循环(也叫增强for循环)时,会报NPE(即空指针异常NullPointerException). 代码如下: ...

  3. java排序之冒泡排序

    代码: package com.cn.algorithm_arithmetic算法; /** * 本程序记录了经典排序算法之冒泡排序 * @author Administrator * */ publ ...

  4. Codeforces Round #541 (Div. 2) C.Birthday

    链接:https://codeforces.com/contest/1131/problem/C 题意: 求给的n个数,相邻差值最小的排列方式.1-n相邻. 思路: sort后隔一个取一个,取到底后再 ...

  5. Android 流量测试方法

    流量测试怎么测?下面总结了几个方法: 一.通过pid获取流量 > 1.获取应用的pid adb shell ps | grep packagename 2.通过pid获取该进程的流量信息 adb ...

  6. c/c++学习系列之内存对齐

    1.C++内存对齐规则 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你 ...

  7. C51 笔记

    一 关于宏常量的长度:C51中定义一个常数宏(默认是16位的),如果用宏表示一个32位的宏而不加'L'标志的话就会出错.如 #define BLOCK_A_BASEADDR  18*64*1024 / ...

  8. java transient关键字作用,使用场景

    transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...

  9. jsp动态图片页面基础

    1. 什么是动态网页? 动态网页是指在服务器端运行的程序或者网页,它们会随不同客户.不同时间,返回不同的网页. 注意:在静态网页中插入flash ,虽然flash是在动的,但是并不是说这个网页就是动态 ...

  10. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第七天(非原创)

    文章大纲 一.课程介绍二.Redis基础实战三.Redis之高可用.集群.云平台搭建实战四.淘淘商城Jedis整合spring五.项目源码与资料下载六.参考文章   一.课程介绍 一共14天课程(1) ...