Blue Jeans

HDOJ-3080

  • 本题使用的是KMP算法加暴力解决
  • 首先枚举第一个字符串的所有子串,复杂度为O(60*60),随后再将每个子串和所有剩下的m-1个字符串比较,看是否存在这个子串
  • 若所有的字符串都有该子串,则看是否是最长的,如果是等长的再看是否是字典序最小的。
  • 本题我wa了很多发的地方就是子串的len即长度那里,没有加等号,所以。。。无奈
  • 还需要注意的是使用快速输入输出,才不会超时。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n;
string s[11];
const int N=122;
int pi[N];
void Pi(string s){
memset(pi,0,sizeof(pi));
int n=s.length();
pi[0]=0;
for(int i=1;i<n;i++){
int j=pi[i-1];
while(j>0&&s[i]!=s[j]){
j=pi[j-1];
}
if(s[i]==s[j])
j++;
pi[i]=j;
}
}
bool exit(string id1,int id2){
string com=id1+'#'+s[id2];
Pi(com);
int n=id1.length();
int m=s[id2].length();
for(int i=0;i<com.length();i++){
if(pi[i]==n){
return 1;
}
}
return 0;
}
bool alpha(string a,string b){
int i=0;
for(;i<a.length()&&i<b.length();i++){
if(a[i]<b[i])
return 1;
if(b[i]<a[i])
return 0;
}
if(i==a.length())
return 1;
else return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
//scanf("%d",&t);
cin>>t;
while(t--){
cin>>n;
//scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>s[i];
//scanf("%s",&s[i]);
}
int m=s[0].length();
int maxs=2;
string ans;
for(int i=0;i<m;i++){
for(int len=maxs;len<=m-i;len++){//子串的长度。长度最少为3,len<=m-i很重要,否则会wa
if(len<3)
continue;
string sub=s[0].substr(i,len);
bool flag=true;
for(int j=1;j<n;j++){//剩下的字符串
if(!exit(sub,j)){
flag=false;
break;
}
}
if(flag){//如果所有的字符串都
if(len>maxs){
maxs=len;
ans=sub;
}else if(len==maxs){
ans=min(ans,sub);//字典序
}
}
}
}
if(maxs==2)
cout<<"no significant commonalities"<<endl;
else
{
cout<<ans<<endl;
}
}
return 0;
}

POJ-3080(KMP+多个字符串的最长公共子串)的更多相关文章

  1. POJ2774 Long Long Message —— 后缀数组 两字符串的最长公共子串

    题目链接:https://vjudge.net/problem/POJ-2774 Long Long Message Time Limit: 4000MS   Memory Limit: 131072 ...

  2. 求两个字符串的最长公共子串——Java实现

    要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的) public class Main03{ // 求解两个字符号的最长 ...

  3. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

  4. [URAL-1517][求两个字符串的最长公共子串]

    Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speec ...

  5. POJ3294--Life Forms 后缀数组+二分答案 大于k个字符串的最长公共子串

                                                                              Life Forms Time Limit: 500 ...

  6. 【Java例题】5.5 两个字符串中最长公共子串

    5. 查找两个字符串中含有的最长字符数的公共子串. package chapter5; import java.util.Scanner; public class demo5 { public st ...

  7. poj2774 后缀数组2个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 26601   Accepted: 10 ...

  8. 求两个字符串的最长公共子串(LCS)

    http://tianyunpu2008.blog.163.com/blog/static/6559379920089162236915/

  9. 【java】求两个字符串的最长公共子串

    这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不 ...

随机推荐

  1. 【uva 247】Calling Circles(图论--Floyd 传递闭包+并查集 连通分量)

    题意:有N个人互相打了M次电话,请找出所有电话圈(Eg.a→b,b→c,c→d,d→a 就算一个电话圈)并输出.(N≤25,L≤25,注意输出格式) 解法:由于N比较小所有n^2或n^3的复杂度都没有 ...

  2. 【uva 1471】Defense Lines(算法效率--使用数据结构+部分枚举+类贪心)

    P.S.我完全一个字一个字敲出来的血泪史啊~~所以,没有附代码,也是可以理解的啦.OvO 题意:给一个长度为N(N≤200000)的序列,要删除一个连续子序列,使得剩下的序列中有一个长度最大的连续递增 ...

  3. hdu5407CRB and Candies (逆元+数学公式)

    Problem Description CRB has N different candies. He is going to eat K candies. He wonders how many c ...

  4. 第三方库:logger,自定义日志封装模块

    为了使用方便,二次封装logger. import os import datetime from loguru import logger class Logings: __instance = N ...

  5. OpenStack Train版-7.neutron网络服务概述

    网络服务NEUTRON概述 一.NEUTRON架构 OpenStack的网络服务neutron是整个OpenStack中最复杂的一个部分,它的基本架构是一个中心服务(neutron-server)外加 ...

  6. C++ part6

    C++源文件从文本到可执行文件经历的过程 references: 一个C++源文件从文本到可执行文件经历的过程 C++源文件从文本到可执行文件经历的过程 gcc程序编译的静态链接和动态链接 保留中间过 ...

  7. Celery&Flower文档笔记

    1.Celery # tasks.py from celery import Celery app = Celery('tasks', broker='redis://localhost:6379', ...

  8. POJ 2778 DNA Sequence(AC自动机 + 矩阵快速幂)题解

    题意:给出m个模式串,要求你构造长度为n(n <= 2000000000)的主串,主串不包含模式串,问这样的主串有几个 思路:因为要不包含模式串,显然又是ac自动机.因为n很大,所以用dp不太好 ...

  9. Redis 集合统计(HyperLogLog)

    统计功能是一类极为常见的需求,比如下面这个场景: 为了决定某个功能是否在下个迭代版本中保留,产品会要求统计页面在上新前后的 UV 作为决策依据. 简单来说就是统计一天内,某个页面的访问用户量,如果相同 ...

  10. The Weekly Web Dev Challenge: Emoji Ratings

    The Weekly Web Dev Challenge: Emoji Ratings /* DESCRIPTION: You job is to enable users to give a rat ...