题目大意

给定n个字符串,字符串可逆序可顺序,求它们的最长公共子串

题解

在输入的过程中记录一下最短的那个字符串,然后枚举起点,然后进行二分求出子串末位置,然后再验证是否是公共子串,记录最长的公共子串就是最终答案~~~~时间复杂度为O(N^3*logn)

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 105
#define INF 0x3f3f3f3f
char T[MAXN][MAXN];
int f[MAXN];
void getfail(char *p,int len)
{
int j;
f[]=j=-;
for(int i=;i<len;i++)
{
while(j>=&&p[j+]!=p[i]) j=f[j];
if(p[j+]==p[i])j++;
f[i]=j;
}
}
bool find(char *s,int len,int n)
{
getfail(s,len);
for(int i=;i<n;i++)
{
int j=-,lt=strlen(T[i]);
bool flag1=false,flag2=false;
for(int t=;t<lt;t++)
{
while(j>=&&s[j+]!=T[i][t]) j=f[j];
if(s[j+]==T[i][t]) j++;
if(j+==len)
{
flag1=true;
break;
}
}
char ss[MAXN];
strcpy(ss,T[i]);
reverse(ss,ss+lt);
j=-;
for(int t=;t<lt;t++)
{
while(j>=&&s[j+]!=ss[t]) j=f[j];
if(s[j+]==ss[t]) j++;
if(j+==len)
{
flag2=true;
break;
}
}
if(!flag1&&!flag2) return false;
}
return true; }
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
int n,maxlen=-INF,len=INF;
char s[MAXN];
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%s",T[i]);
if(len>strlen(T[i]))
{
len=strlen(T[i]);
strcpy(s,T[i]);
}
}
for(int i=;i<len;i++)
{
int l=i,r=len-,lens=-INF;
while(l<=r)
{
int mid=(l+r)>>;
bool flag=find(s+i,mid-i+,n);
if(flag)
{
l=mid+;
lens=mid-i+;
}
else
r=mid-;
if(lens!=-INF&&lens>maxlen) maxlen=lens;
}
}
if(maxlen!=-INF)
printf("%d\n",maxlen);
else
{
printf("0\n");
}
}
return ;
}

POJ1226 - Substrings(KMP+二分)的更多相关文章

  1. POJ1226 Substrings(二分+后缀数组)

    题意:给n个字符串,求最长的子串,满足它或它的逆置出现在所有的n个字符串中. 把n个字符串及其它们的逆置拼接,中间用不同字符隔开,并记录suffix(i)是属于哪个字符串的: 跑后缀数组计算heigh ...

  2. POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串

    题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS   Memory Limit: 10000K Total ...

  3. 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash

    题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...

  4. 【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分

    Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意--写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书, ...

  5. HDU4763-Theme Section(KMP+二分)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. POJ1226:Substrings(后缀数组)

    Description You are given a number of case-sensitive strings of alphabetic characters, find the larg ...

  7. POJ3080 - Blue Jeans(KMP+二分)

    题目大意 求N个字符串的最长公共字串 题解 和POJ1226做法一样...注意是字典序最小的...WA了一次 代码: #include <iostream> #include <cs ...

  8. hdu 1238 Substrings(kmp+暴力枚举)

    Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...

  9. Substrings kmp

    Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...

随机推荐

  1. 2014年度辛星css教程夏季版第四节

    接下来的这一节我计划讲解的是超链接和列表的样式,然后我们做出一个导航栏出来,其实导航栏是非常常见的,但是我们这里做得这个有点并不那么完善,等我们学完了css之后再完善它. ************** ...

  2. HTTP - PUT 上传文件/Shell (二)

    上一篇文章 HTTP - PUT 上传文件/Shell 讲到自己搭了一个环境,去测试HTTP - PUT上传Shell.最近又遇到几个PUT上传的例子,也成功上传了几次,来分享一下思密达. 0x00 ...

  3. linux环境下验证码不显示的几种情况

    linux环境下验证码不显示的几种情况 gd库扩展没有安装. 查看phpinfo(),看看有没有安装gd库 yum安装gd库或者phpize安装 安装完成后记得重启php-fpm bom头的原因 在生 ...

  4. gentoo

    http://www.aboutyun.com/thread-8522-1-1.html        .java.io.IOException: Connection reset by peer c ...

  5. Linux PS 命令详解

    Linux操作系统PS命令详细解析 要对系统中进程进行监测控制,用 ps 命令满足你. /bin/ps ps 是显示瞬间行程的状态,并不动态连续:如果想对进程运行时间监控,应该用 top 工具. ki ...

  6. asp.net推送

    http://tech.it168.com/a2012/0210/1310/000001310252_all.shtml http://www.infoq.com/cn/news/2012/09/rc ...

  7. 汇编语言第二版 程序在dos中执行情况.P86-87

    假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...

  8. 李洪强漫谈iOS开发[C语言-023]-取余数运算符

  9. easyui源码翻译1.32---ProgressBar(进度条)

    前言 使用$.fn.progressbar.defaults重写默认值对象.下载该插件翻译源码 进度条提供了一个反馈显示一个长时间运行的操作进展.可以更新的进展条,让用户知道当前正在执行操作. 源码 ...

  10. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...