POJ1226 - Substrings(KMP+二分)
题目大意
给定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+二分)的更多相关文章
- POJ1226 Substrings(二分+后缀数组)
题意:给n个字符串,求最长的子串,满足它或它的逆置出现在所有的n个字符串中. 把n个字符串及其它们的逆置拼接,中间用不同字符隔开,并记录suffix(i)是属于哪个字符串的: 跑后缀数组计算heigh ...
- POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串
题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS Memory Limit: 10000K Total ...
- 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash
题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...
- 【bzoj3796】Mushroom追妹纸 hash/sa+kmp+二分
Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意--写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从网上找到了两篇极佳的情书, ...
- HDU4763-Theme Section(KMP+二分)
Theme Section Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- POJ1226:Substrings(后缀数组)
Description You are given a number of case-sensitive strings of alphabetic characters, find the larg ...
- POJ3080 - Blue Jeans(KMP+二分)
题目大意 求N个字符串的最长公共字串 题解 和POJ1226做法一样...注意是字典序最小的...WA了一次 代码: #include <iostream> #include <cs ...
- hdu 1238 Substrings(kmp+暴力枚举)
Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...
- Substrings kmp
Problem Description You are given a number of case-sensitive strings of alphabetic characters, find ...
随机推荐
- Google地图数据算法
Google Maps与Google Earth中的每个级别的每一副图片都有一个URL,例如下面这幅我们学校的图的地址是http://kh.google.com/kh?v=3&t=trstrq ...
- 用android-x86模拟器不能运行程序错误Tag:libc的问题
如果用的是x86的android模拟器,运行软件时一闪就关闭logcat中:类似:Fatal signal 11 (SIGSEGV) at 0x00000078 (code=1), thread 16 ...
- linux环境下验证码不显示的几种情况
linux环境下验证码不显示的几种情况 gd库扩展没有安装. 查看phpinfo(),看看有没有安装gd库 yum安装gd库或者phpize安装 安装完成后记得重启php-fpm bom头的原因 在生 ...
- POSIX多线程编程(上)-基本概念
线程概念 我们把正在计算机中执行的程序叫做"进程"(Process) ,而不将其称为程序(Program).所谓"线程"(Thread),是"进程&q ...
- Highcharts资料
对应的API: http://api.hcharts.cn/#chart.events 对应的中文网实例:http://www.hcharts.cn/demo/highcharts/dynamic ...
- BZOJ 3929 Circle of digits 解题报告
首先,我们可以得到最高位的位数为:\(\lfloor\frac{n+k-1}{n}\rfloor\),记作 \(E\). 然后给这 \(n\) 个长为 \(E\) 的数字排序,后缀数组 \(O((n+ ...
- [转载]C#.NET中Dns类的常用方法及说明
IP是一种普遍应用于因特网.允许不同主机能够相互找到对方的寻址协议.IP地址由4个十进制的数字号码所组成,而每一个号码的值介于0~255之间,它虽然解决了网络上计算机的识别问题,但是IP地址确不容易记 ...
- POJ2225+BFS
简单的BFS 1a /* 从起点到终点 */ #include<stdio.h> #include<string.h> #include<stdlib.h> # ...
- minicom installation and configuration on ubuntu
minicom是一个串口通信工具,就像Windows下的超级终端,可用来与串口设备通信.minicom完全通过键盘实现操作. install sudo apt-get install minicom ...
- amaze UI的使用
1.放置在独立的位置 2.引入核心css与js <link href="{sh::PUB}amaze-ui/css/amazeui.min.css" rel="st ...