跟3294比较类似,但是不需要输出具体的串,比较简单,只要把串反转连接上去解法就一样了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+9;
int r[maxn];
int c[maxn];
char a[1111];
int n,m;
int *rank,height[maxn],sa[maxn];
int wx[maxn],wy[maxn],cnt[maxn];
inline bool 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 n,int m)
{
r[n+1]=0;
int i,l,p,*x=wx,*y=wy,*t;
memset(cnt,0,sizeof(int)*(m+1));
for(int i=1;i<=n;i++) cnt[x[i]=r[i]]++;
for(int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for(int i=n;i>=1;i--) sa[cnt[x[i]]--]=i;
for(l=1,p=1;p<n;l<<=1,m=p)
{
for(p=1,i=n-l+1;i<=n;i++) y[p++]=i;
for(i=1;i<=n;i++)
if(sa[i]>l)
y[p++]=sa[i]-l;
memset(cnt,0,sizeof(int)*(m+1));
for(i=1;i<=n;i++) cnt[x[i]]++;
for(i=1;i<=m;i++) cnt[i]+=cnt[i-1];
for(i=n;i>=1;i--) sa[cnt[x[y[i]]]--]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[1]]=1,i=2;i<=n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],l)?p:++p;
}
rank=x;
int j,k=0;
for(i=1;i<=n;height[rank[i++]]=k)
for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
return;
} bool fla[111];
bool chk(int ret)
{
for(int i=2;i<=n;i++)
if(height[i]>=ret)
{
int j=i+1;
while(height[j]>=ret) j++;
j--;
memset(fla,0,sizeof(fla));
for(int k=i-1;k<=j;k++)
fla[c[sa[k]]]=1;
int cnt=0;
for(int k=1;k<=m;k++)
cnt+=fla[k];
if(cnt==m) return true;
}
return false;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
n=0;
int ret;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%s",a+1);
ret=strlen(a+1);
for(int j=1;j<=ret;j++)
r[n+j]=a[j];
n+=ret;
r[++n]=280+i*2-1;
for(int j=1;j<=ret;j++)
r[n+(ret-j+1)]=a[j];
n+=ret;
r[++n]=280+i*2;
for(int j=n-ret-ret-2+1;j<=n;j++)
c[j]=i;
}
da(r,n,500);
int st=0,ed=111,mid;
while(st<ed)
{
mid=st+ed+1>>1;
if(chk(mid)) st=mid;
else ed=mid-1;
}
printf("%d\n",st);
}
return 0;
}

poj 1226的更多相关文章

  1. POJ - 3294~Relevant Phrases of Annihilation SPOJ - PHRASES~Substrings POJ - 1226~POJ - 3450 ~ POJ - 3080 (后缀数组求解多个串的公共字串问题)

    多个字符串的相关问题 这类问题的一个常用做法是,先将所有的字符串连接起来, 然后求后缀数组 和 height 数组,再利用 height 数组进行求解. 这中间可能需要二分答案. POJ - 3294 ...

  2. POJ - 1226 Substrings (后缀数组)

    传送门:POJ - 1226 这个题跟POJ - 3294  和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...

  3. POJ 1226 后缀数组

    题目链接:http://poj.org/problem?id=1226 题意:给定n个字符串[只含大小写字母],求一个字符串要求在n个串或者他们翻转后的串的出现过.输出满足要求的字符串的长度 思路:根 ...

  4. OpenJudge/Poj 1226 Substrings

    1.链接地址: http://bailian.openjudge.cn/practice/1226/ http://poj.org/problem?id=1226 2.题目: 总时间限制: 1000m ...

  5. POJ 1226 Substrings(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ...

  6. POJ 1226 Substrings

    Substrings Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: ...

  7. 【POJ 1226】Substrings

    [链接]h在这里写链接 [题意] 给你n个字符串. 让你找一个字符串s. 设s'为这个字符串的逆序. 要求s或者s'在每个字符串里都能够找得到. 并且要求s的长度最长. 求出这个最长的串的长度. [题 ...

  8. poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)

    题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...

  9. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

随机推荐

  1. 【C语言】37个关键字

    C语言37个关键字 一.相关基础知识 年. 关键字:是由系统定义的,不能重新做其他定义的字符,且每个关键字已经赋予了不同的意义,让编程者能够使用来告诉编译器完成不同的工作PS:C语言严格区分大小写,i ...

  2. Razor引擎总结

    1.显示格式化小数:@(string.Format("{0:0.00}",ViewData["TradeAmount"].ToNullString()))

  3. Hibernate过程小计

    对实体 "XXX" 的引用必须以 ';' 分隔符结尾(需要对分号进行编码) <property name="connection.url">jdbc ...

  4. 【web安全】第一弹:利用xss注入获取cookie

    首先一定要先来吐槽一下tipask系统.这是一枚开源的类似百度知道的系统,但是漏洞多多,最基本的XSS注入都无法防御. 言归正传: [准备1] cookie接收服务器. 平时喜欢用sae,所以在sae ...

  5. cocos2dx 3.3创建新项目 和 VS2012解决方案加载失败问题

     首先创建新项目,步骤如下: 1.进入cocos2d-x-3.3\tools\cocos2d-console\bin目录,按住shift+鼠标右键 2.输入 cocos new 项目名 –p 包名 – ...

  6. 注解方式传LIST@RequestBody

    在SpringMVC中使用注解方式传List类型的参数时,要使用@RequestBody注解而不是@RequestParam注解 //创建文件夹 @RequestMapping(value=" ...

  7. 关于配置ST_Geometry报ORA-06522的问题

    环境 SDE版本:10./10.2/10.2.1/10.2.2 Oracle版本:11g R2 11.2.0.1 Windows版本:Windows Server 2008 R2 问题描述及原因 li ...

  8. python之--条件判断和循环

    Python之判断 和其他语言一样,python同样具有条件判断和循环的操作,比如我们可以编写一个简单的判断操作:使用if关键字可以达到判断的效果,如下例: >>> test_if ...

  9. 利用if else咱们结婚吧

    class Program    {        static void Main(string[] args)        {            while (true)           ...

  10. bzoj2893

    有起点终点的限制的路径覆盖首先tarjan缩点成DAG似乎不能按照二分匹配的做法做那么建立源汇拆点i,i',这两点之间连一条下界为1上界无穷的边,其它边都是下界为0,上界正无穷然后就是有源有汇的最小流 ...