题解:

后缀数组

把所有串先翻转,用一个没有出现过的字符连接

然后再把所有串接起来

然后用一个没有出现过的字符连接

然后二分

在后缀数组上判断lcp

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long LL;
const int N=**;
char str[];
int r[N],len,n,t,Index[N],Rank[N],height[N],sa[N],wa[N],wb[N],wv[N],WS[N];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(int *r,int *sa,int n,int m)
{
int p,*x=wa,*y=wb,*t;
for (int i=;i<m;i++)WS[i]=;
for (int i=;i<n;i++)WS[x[i]=r[i]]++;
for (int i=;i<m;i++)WS[i]+=WS[i-];
for (int i=n-;i>=;i--)sa[--WS[x[i]]]=i;
for (int j=,p=;p<n;j*=,m=p)
{
p=;
for (int i=n-j;i<n;i++)y[p++]=i;
for (int i=;i<n;i++)
if (sa[i]>=j)y[p++]=sa[i]-j;
for (int i=;i<n;i++)wv[i]=x[y[i]];
for (int i=;i<m;i++)WS[i]=;
for (int i=;i<n;i++)WS[wv[i]]++;
for (int i=;i<m;i++)WS[i]+=WS[i-];
for (int i=n-;i>=;i--)sa[--WS[wv[i]]]=y[i];
t=x,x=y,y=t,p=,x[sa[]]=;
for (int i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
}
void calheight(int *r,int *sa,int n)
{
int k=;
for (int i=;i<=n;i++)Rank[sa[i]]=i;
for (int i=;i<n;height[Rank[i++]]=k)
{
k?k--:;
for (int j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
}
return;
}
int check(int x)
{
set<int>se;
for (int i=;i<len;i++)
{
if (height[i]>=x)
{
se.insert(Index[sa[i]]);
se.insert(Index[sa[i-]]);
}
else
{
if (se.size()==n)return ;
se.clear();
}
}
if (se.size()==n)return ;
return false;
}
void solve()
{
int L=,R=,ans=;
while (R>=L)
{
int mid=(L+R)/;
if (check(mid))
{
ans=mid;
L=mid+;
}
else R=mid-;
}
printf("%d\n",ans);
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d",&n);len=;
for (int i=,val=;i<=n;i++)
{
scanf("%s",&str);
for (int j=;j<strlen(str);j++)
{
Index[len]=i;
r[len++]=(str[j]-'A'+*n+);
}
Index[len]=i;
r[len++]=val++;
for (int j=strlen(str)-;j>=;j--)
{
Index[len]=i;
r[len++]=(str[j]-'A'+*n+);
}
Index[len]=i;
r[len++]=val++;
}
da(r,sa,len,);
calheight(r,sa,len-);
solve();
}
return ;
}

poj1226的更多相关文章

  1. poj1226,poj3080

    看来以后用pascal的函数要小心了: 简简单单pos其实时间复杂度是二次方级的…… 今天学习的是KMP——字符匹配算法: 这两道题也都很简单,都是为这个算法练手的, 最朴素的匹配显然是穷举起始位置然 ...

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

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

  3. 【POJ1226】Substrings(后缀数组,二分)

    题意: n<=10,len<=100 思路: 只有一个字符串的时候特判一下 #include<cstdio> #include<cstring> #include& ...

  4. POJ1226:Substrings(后缀数组)

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

  5. POJ1226 - Substrings(KMP+二分)

    题目大意 给定n个字符串,字符串可逆序可顺序,求它们的最长公共子串 题解 在输入的过程中记录一下最短的那个字符串,然后枚举起点,然后进行二分求出子串末位置,然后再验证是否是公共子串,记录最长的公共子串 ...

  6. POJ1226 Substrings

    后缀数组. 求多个字符串翻转与否中最长公共子串长. 二分答案,反过来多建一倍的字符串,二分时特判一下即可. By:大奕哥 #include<cstring> #include<cst ...

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

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

  8. POJ1226(strstr)

    Substrings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13348   Accepted: 4722 Descr ...

  9. [POJ1226]Substrings(后缀数组)

    传送门 给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串. 算法分析: 这题不同的地方在于要判断是否在反转后的字符串中出现.其实这并没有加大题目的难度. 只需要先将每个字符串都反过来写一 ...

随机推荐

  1. 《剑指offer》第四十二题(连续子数组的最大和)

    // 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整 // 数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). #in ...

  2. 学习笔记41—ttest误区

    1.grapPad软件里面双T结果和matlab,EXCEl里面双T结果一致时,设置如下:

  3. Lambda语法篇

    函数式接口 函数式接口(functional interface 也叫功能性接口,其实是同一个东西).简单来说,函数式接口是只包含一个方法的接口. Lambda语法 包含三个部分 一个括号内用逗号分隔 ...

  4. Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务

    前一章, 我们的Hello world应用服务,通过配置服务器Config Server获取到了我们配置的hello信息“hello world”. 但自己的配置文件中必须配置config serve ...

  5. MySQL Server and Server-Startup Programs

    1. mysqld-The MySQL Server mysqld,also known as mysql server, is the main program that does most of ...

  6. Zabbix安装(debian,centos)

    lnmp和lamp架构搭建一键安装脚本下载地址:https://lnmp.org/download.html  https://github.com/teddysun/lamp/tree/master ...

  7. Mycat水平拆分之十种分片规则

    水平切分分片实现   配置schema.xml  在同一个mysql数据库中,创建了三个数据库 testdb1,testdb2,testdb3.并在每个库中都创建了user表     <?xml ...

  8. You Don't Know JS: Scope & Closures (第3章: 函数 vs 块作用域)

    第二章,作用域由一系列的bubbles组成.每一个都代表了一个container或bucket,装着被声明的identifiers(variables, functions).这些bubbles相互嵌 ...

  9. ayit-#41. 因数的个数-数论

    搞了两天发现是qpow时大数相乘爆精度了,以前没遇到过,因为大数检测时模数达到了1e18,所以qpow可能会爆,应该利用快速幂原理写一个快速加即可. 先筛出1e6以内的质数,然后把x里<=1e6 ...

  10. 九校模拟——餐馆(restaurant)

    1 餐馆(restaurant) 1.1 题目背景 铜企鹅是企鹅餐馆的老板,他正在计划如何使得自己本年度收益增加. 1.2 题目描述 共有n 种食材,一份食材i 需要花ti 小时不间断地进行播种,施肥 ...