题目大意:回答任意两个子串的最长公共前缀。

题目分析:后缀数组的模板题。但是输入输出都要外挂。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; const int N=1000; int n,m;
char s[N+5];
int cnt[N+5],SA[N+5];
int rk[N+5],tSA[N+5];
int height[N+5];
int ans[N+5][N+5]; void in(int &x)
{
x=0;
char c=getchar();
while(c<'0'||c>'9'){
c=getchar();
}
x=c-'0';
while(c=getchar()){
if(c<'0'||c>'9') break;
x=x*10+c-'0';
}
} void out(int x)
{
if(x>=10)
out(x/10);
putchar(x%10+'0');
} bool same(int *y,int i,int j,int k)
{
if(y[SA[i]]!=y[SA[j]]) return false;
if(SA[i]+k>=n&&SA[j]+k>=n) return true;
if(SA[i]+k<n&&SA[j]+k>=n) return false;
if(SA[i]+k>=n&&SA[j]+k<n) return false;
return y[SA[i]+k]==y[SA[j]+k];
} void buildSA()
{
m=130;
int *x=rk,*y=tSA;
for(int i=0;i<m;++i) cnt[i]=0;
for(int i=0;i<n;++i) ++cnt[x[i]=s[i]];
for(int i=1;i<m;++i) cnt[i]+=cnt[i-1];
for(int i=n-1;i>=0;--i) SA[--cnt[x[i]]]=i;
for(int k=1;k<=n;k<<=1){
int p=0;
for(int i=n-k;i<n;++i) y[p++]=i;
for(int i=0;i<n;++i) if(SA[i]>=k) y[p++]=SA[i]-k;
for(int i=0;i<m;++i) cnt[i]=0;
for(int i=0;i<n;++i) ++cnt[x[y[i]]];
for(int i=1;i<m;++i) cnt[i]+=cnt[i-1];
for(int i=n-1;i>=0;--i) SA[--cnt[x[y[i]]]]=y[i];
p=1;
swap(x,y);
x[SA[0]]=0;
for(int i=1;i<n;++i){
if(same(y,i,i-1,k)) x[SA[i]]=p-1;
else x[SA[i]]=p++;
}
if(p>=n) break;
m=p;
}
} void getHeight()
{
for(int i=0;i<n;++i)
rk[SA[i]]=i;
height[0]=0;
for(int i=1;i<n;++i){
int k=0;
while(s[SA[i]+k]==s[SA[i-1]+k]) ++k;
height[i]=k;
}
} void getAns()
{
for(int i=0;i<n;++i) ans[i][i]=n-i;
for(int i=0;i<n;++i){
int minn=n;
for(int j=i+1;j<n;++j){
minn=min(minn,height[j]);
ans[SA[i]][SA[j]]=ans[SA[j]][SA[i]]=minn;
}
}
} int main()
{
int q,a,b;
while(~scanf("%d",&n))
{
scanf("%s",s);
buildSA();
getHeight();
getAns();
in(q);
while(q--)
{
in(a);
in(b);
out(ans[a][b]);
puts("");
}
}
return 0;
}

  

51nod-1732 婚姻介绍所(后缀数组)的更多相关文章

  1. 51nod 1732 LCS变形

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1732 1732 51nod婚姻介绍所 题目来源: 原创 基准时间限制:1 ...

  2. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  3. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  4. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  5. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  6. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  7. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  8. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

  9. 【BZOJ-2119】股市的预测 后缀数组

    2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 334  Solved: 154[Submit][Status][Discuss ...

随机推荐

  1. 《BI那点儿事》数据流转换——模糊查找转换

    BI项目中经常会有一些提取,转换,数据处理(ELT)的工作,其中最主要的是处理过赃数据.假设在项目中我们向数据库中注入了测试数据,但是通过一个外键从另外一个表中载入数据的时候没有对应的数据,那么这一行 ...

  2. svn查看代码作者的命令

    svn blame **.java | grep ** svn查看代码作者的命令

  3. Centos6下rpm安装MySQL5.6

    Centos6在rpm安装 rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm yum install ...

  4. web字体详解@font-face

    一:字体的下载(http://www.dafont.com/new.php) 二:选择需要的字体并下载( Download ) 三:下载后并解压 四:获取@font-face所需要字体的格式.eot, ...

  5. Implement strStr() [LeetCode]

    Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...

  6. Android 系统ID介绍

    Android上系统ID有很多,本文只介绍常用的ANDROID ID.DEVICE ID.IMEI/MEID.WIFI/BT ADDRESS等几个,本文介绍这些ID的数据格式.长度及一些基本知识. 一 ...

  7. const char * char * const

    2 区分 const * 与 * const 的差别 ( 1 ) 指针本身是常量不可变 ( char * ) const  pCount; const (char *)  pCount; ( 2 ) ...

  8. NetworkComms V3 之同时监听多端口

    NetworkComms网络通信框架序言 NetworkComms通信框架,是一款来自英国的c#语言编写的通信框架,历时6年研发,成熟稳定,性能可靠.   框架支持同时监听服务器上的多个端口,写法如下 ...

  9. ubuntu下minicom和USB转串口(转)

    ubuntu下minicom和USB转串口(转)   minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利 ...

  10. C语言基础--for循环

    for循环格式: for (初始化表达式;条件表达式;循环后增量表达式) { 语句; ... } 条件表达式: 和while, dowhile一样, 只有条件满足才会执行循环体 初始化表达式: 在整个 ...