题解:

后缀数组

把所有串连接起来

二分答案

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
const int N=;
typedef long long ll;
using namespace std;
char ch[N];
int str[N],l[N],mx[N],mn[N],in[N],k,wa[N],wb[N],wv[N],Ws[N],sa[N],Rank[N],height[N];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(const int *r,int *sa,int n,int m)
{
int *x=wa,*y=wb;
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];
swap(x,y);p=;x[sa[]]=;
for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
}
void calheight(const int *r,int *sa,int n)
{
int j,k=;
for (int i=;i<=n;i++) Rank[sa[i]]=i;
for (int i=;i<n;height[Rank[i++]]=k)
for (k?k--:,j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
}
int pd(int mid,int n)
{
for (int i=;i<k;i++){mx[i]=;mn[i]=1e9;}
for (int i=;i<=n;i++)
{
if (height[i]<mid)
{
for (int j=;j<k;j++)
{
mx[j]=;
mn[j]=1e9;
}
mx[in[sa[i]]]=sa[i];
mn[in[sa[i]]]=sa[i];
}
else
{
mx[in[sa[i]]]=max(mx[in[sa[i]]],sa[i]);
mn[in[sa[i]]]=min(mn[in[sa[i]]],sa[i]);
mx[in[sa[i-]]]=max(mx[in[sa[i-]]],sa[i-]);
mn[in[sa[i-]]]=min(mn[in[sa[i-]]],sa[i-]);
int j;
for (j=;j<k;j++)
if (mx[j]-mn[j]<mid)break;
if (j==k) return ;
}
}
return ;
}
int main()
{
int cnt=,t;
scanf("%d",&t);
while (t--)
{
scanf("%d",&k);
int n=;
for (int i=;i<k;i++)
{
scanf("%s",ch);
l[i]=strlen(ch);
for (int j=n;j<n+l[i];j++)
{
str[j]=ch[j-n]-'a'+;
in[j]=i;
}
n+=l[i]+;
str[n-]=+i;
}
n--;
str[n]=;
da(str,sa,n+,+k+);
calheight(str,sa,n);
int l=,r=;
while (l<r)
{
int mid=(l+r+)/;
if (pd(mid,n))l=mid;
else r=mid-;
}
printf("%d\n",l);
}
return ;
}

spoj220的更多相关文章

  1. 【SPOJ220】Relevant Phrases of Annihilation(后缀数组,二分)

    题意: n<=10,len<=1e4 思路: #include<cstdio> #include<cstring> #include<string> # ...

  2. SPOJ220 Relevant Phrases of Annihilation(后缀数组)

    引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组.然后二分答案,再将后缀分组.判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并 ...

  3. SPOJ220 Relevant Phrases of Annihilation

    http://www.spoj.com/problems/PHRASES/ 题意:给n个串,求n个串里面都有2个不重叠的最长的字串长度. 思路:二分答案,然后就可以嘿嘿嘿 PS:辣鸡题目毁我青春,一开 ...

  4. 2018.11.30 spoj220 Relevant Phrases of Annihilation(后缀数组+二分答案)

    传送门 代码: 先用特殊字符把所有字符串连接在一起. 然后二分答案将sasasa数组分组. 讨论是否存在一个组满足组内对于每一个字符串都存在两段不相交字串满足条件. #include<bits/ ...

  5. 【SPOJ220】Relevant Phrases of Annihilation (SA)

    成功完成3连T!   嗯没错,三道TLE简直爽到不行,于是滚去看是不是模版出问题了..拿了3份其他P党的模版扔上去,嗯继续TLE...蒟蒻表示无能为力了... 思路像论文里面说的,依旧二分长度然后分组 ...

  6. 【距离GDOI:131天】 后缀数组完毕

    用了近两周的时间,终于把罗神那篇后缀数组应用看完了,题目也写了一遍,T了无数次...详见前几篇博文... 后缀数组很重要的是那个height数组,可以用来做各种奇奇怪怪的东西...常用方法去是去二分, ...

  7. String Algorithm Summary - 1

    目录 Suffix Array Summay 单个字符串问题 两个字符串问题 多个字符串问题 AC-Automaton Summary 求长度为n(2e9)不包含给定字符串的合法串个数 包含至少一个词 ...

随机推荐

  1. 离线人脸识别C#类库分享 虹软2.0版本

    目前只封装了人脸检测部分的类库,供大家交流学习,肯定有问题,希望大家在阅读使用的时候及时反馈,谢谢!使用虹软技术开发完成 戳这里下载SDKgithub:https://github.com/dayAn ...

  2. kbengine学习2 创建项目

    官方文档https://www.comblockengine.com/docs/1.0/get-started/createproject/ 1.kbe服务器端 1.1 复制出一个assets文件夹, ...

  3. SpringMVC 处理Date类型数据@InitBinder @DateTimeFormat 注解 的使用

    使用SpringMVC的时候,需要将表单中的日期字符串转换成对应JavaBean的Date类型,而SpringMVC默认不支持这个格式的转换,解决方法有两种,如下: 方法一 . 在需要日期转换的Con ...

  4. SVN-版本控制工具安装与使用

    什么是版本控制? 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新. 版本控制透过文档控制(documentation con ...

  5. python读取配置文件&&简单封装

    之前有做过把爬虫数据写到数据库中的练习,这次想把数据库信息抽离到一个ini配置文件中,这样做的好处在于可以在配置文件中添加多个数据库,方便切换(另外配置文件也可以添加诸如邮箱.url等信息) 1.co ...

  6. 利用unittest+ddt进行接口测试(二):使用yaml文件管理测试数据

    知道ddt的基本使用方法之后,练习把之前用excel文件来维护的接口测试用例改用unittest+ddt来实现. 这里我选用yaml文件来管理接口参数,开始本来想用json,但是json无法添加注释, ...

  7. Python 编程快速上手 第八章总结

    在下面函数中的()中,可为相对路径,也可为绝对路径. 获知当前目录,改变当前目录,查看当前目录 更改当前目录:os.getcwd() 改变当前目录:os.chdir() 查看当前目录:os.listd ...

  8. Arduino 数字函数总结

    Arduino 有三个数字函数,分别是:pinMode( ), digitalWrite( ),digitalRead( ).三个函数各有其作用,pinMode( ) 在初始化 setup( )函数中 ...

  9. LeetCode--020--括号匹配(java版)

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  10. hdoj5785

    题意:略 先用题解的办法,manacher,然后tag,add数组.但是比较难办的是manacher加了新的字符.这样的话cntL和cntR不是实际的值,但是没关系,原本的字符都在奇数位置,这样cnt ...