【题目链接】 click

【题目大意】

  给出一些字符串,询问查询任意两个字符串的最长公共前缀

【题解】

  将字符串拼接,对拼接的字符串做后缀数组,对于查询的两个字符串,
  只要在height数组上查询区间最小值即可。

  特别注意多组数据时候对字符串结尾的处理,很久没写容易忽视导致wa。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=4000010;
int n,m,Rank[N],sa[N],h[N],tmp[N],cnt[N],ans;char t[N],s[N];
void suffixarray(int n,int m){
int i,j,k;n++;
for(i=0;i<2*n+5;i++)Rank[i]=sa[i]=h[i]=tmp[i]=0;
for(i=0;i<m;i++)cnt[i]=0;
for(i=0;i<n;i++)cnt[Rank[i]=s[i]]++;
for(i=1;i<m;i++)cnt[i]+=cnt[i-1];
for(i=0;i<n;i++)sa[--cnt[Rank[i]]]=i;
for(k=1;k<=n;k<<=1){
for(i=0;i<n;i++){
j=sa[i]-k;
if(j<0)j+=n;
tmp[cnt[Rank[j]]++]=j;
}sa[tmp[cnt[0]=0]]=j=0;
for(i=1;i<n;i++){
if(Rank[tmp[i]]!=Rank[tmp[i-1]]||Rank[tmp[i]+k]!=Rank[tmp[i-1]+k])cnt[++j]=i;
sa[tmp[i]]=j;
}memcpy(Rank,sa,n*sizeof(int));
memcpy(sa,tmp,n*sizeof(int));
if(j>=n-1)break;
}for(j=Rank[h[i=k=0]=0];i<n-1;i++,k++)
while(~k&&s[i]!=s[sa[j-1]+k])h[j]=k--,j=Rank[sa[j]+1];
}
int f[N][30],lg2[N];
void rmq_init(int n){
for(int i=2;i<=n;i++)lg2[i]=lg2[i/2]+1;
for(int i=1;i<=n;i++)f[i][0]=h[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
int rmq_min(int l,int r){
if(l>r)swap(l,r);l++;
int k=lg2[r-l+1];
return min(f[l][k],f[r-(1<<k)+1][k]);
}
int T,pos[N],len[N];
int main(){
scanf("%d",&T); int cas=1;
while(T--){
printf("Case %d:\n",cas++);
scanf("%d",&n); int u=1;
for(int i=1;i<=n;i++){
scanf("%s",&t);
len[i]=strlen(t);
pos[i]=u;
for(int j=0;j<len[i];j++)s[u++]=t[j];
}s[u]=0; //特别注意多组数据s[u]=0!!!!
suffixarray(u,256);
rmq_init(u); int q;
scanf("%d",&q);
while(q--){
int x,y;
scanf("%d%d",&x,&y);
int ans=min(len[x],len[y]);
if(x==y)printf("%d\n",len[x]);
else printf("%d\n",min(ans,rmq_min(Rank[pos[x]],Rank[pos[y]])));
}
}return 0;
}

  

最新文章

  1. angularJS(6)
  2. SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告
  3. Java学习注意事项
  4. hadoop fs管理文件权限
  5. [React Fundamentals] Development Environment Setup
  6. OC - 4.OC核心语法
  7. css3 -&amp;gt; 多栏布局
  8. JavaScript 的 OOP 功能解析
  9. Java中的事务——JDBC事务和JTA事务
  10. SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装
  11. [暂停一天]从零开始PHP学习 - 第六天
  12. js 鸭式辨型法
  13. POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)
  14. eclipse安装java ee插件方法步骤
  15. N厂劳力士黑水鬼V7出了1年,如今依旧被追捧,供不应求
  16. socket.io笔记
  17. ko学习二,绑定语法
  18. linux创建桌面快捷方式
  19. django rest framework(3)
  20. 值得从PHP转向JavaScript

热门文章

  1. 【洛谷 P2763】 试题库问题(最大流)
  2. End to End Sequence Labeling via Bidirectional LSTM-CNNs-CRF论文小结
  3. 解决ie9以下下不支持html5和媒体查询(Media Queries)
  4. selenium===selenium自动化添加日志(转)
  5. linux内核启动分析(2)
  6. python之requests库使用问题汇总
  7. git - 使用原理
  8. 使用cmd(黑窗口)敲命令使用远程数据库
  9. jdbc操作数据库以及防止sql注入
  10. ConcurrentMap.putIfAbsent(key,value) 用法讨论