1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ms(arr,a) memset(arr,a,sizeof arr)
  4. #define debug(x) cout<<"< "#x" = "<<x<<" >"<<endl
  5. const int maxn=4e5;
  6. const int INF=0x3f3f3f3f;
  7. char s[maxn];
  8. int sa[maxn],Rank[maxn],height[maxn],a[maxn],b[maxn],rmq[maxn][50];
  9. int x[maxn],y[maxn],c[maxn];
  10. int len,tot;
  11. void build()
  12. {
  13. int n=strlen(s),m=128;
  14. //int *x=new int[n],*y=new int[n],*c=new int[n+128];
  15. for(int i=0;i<m;++i)c[i]=0;
  16. for(int i=0;i<n;++i)c[x[i]=s[i]]++;
  17. for(int i=1;i<m;++i)c[i]=c[i]+c[i-1];
  18. for(int i=n-1;i>=0;--i)sa[--c[x[i]]]=i;
  19. for(int k=1;k<=n;k<<=1)
  20. {
  21. int p=0;
  22. for(int i=n-k;i<n;++i)y[p++]=i;
  23. for(int i=0;i<n;++i)if(sa[i]>=k)y[p++]=sa[i]-k;
  24. for(int i=0;i<m;++i)c[i]=0;
  25. for(int i=0;i<n;++i)c[x[y[i]]]++;
  26. for(int i=1;i<m;++i)c[i]+=c[i-1];
  27. for(int i=n-1;i>=0;--i)sa[--c[x[y[i]]]]=y[i];
  28. swap(x,y);
  29. p=1;x[sa[0]]=0;
  30. for(int i=1;i<n;++i)x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
  31. if(p>=n)break;
  32. m=p;
  33. }
  34. //delete[] x,y,c;
  35. for(int i=0;i<n;++i)Rank[sa[i]]=i;
  36. int len=0;
  37. for(int i=0;i<n;++i)
  38. {
  39. if(len)len--;
  40. if(Rank[i]==0)continue;
  41. int j=sa[Rank[i]-1];
  42. while(s[i+len]==s[j+len])len++;
  43. height[Rank[i]]=len;
  44. }
  45. for(int i=1;i<n;++i)rmq[i][0]=height[i];
  46. for(int i=1;(1<<i)<n;++i)for(int j=1;j+(1<<i)<=n;++j)rmq[j][i]=min(rmq[j][i-1],rmq[j+(1<<(i-1))][i-1]);
  47. }
  48. int lcp(int a,int b)
  49. {
  50. if(a==b)return strlen(s+sa[a]);
  51. if(a>b)swap(a,b);
  52. int k=0;
  53. while((1<<(k+1))<=b-a)k++;
  54. return min(rmq[a+1][k],rmq[b-(1<<k)+1][k]);
  55. }
  56. int main()
  57. {
  58. freopen("Input.txt","r",stdin);
  59. int T;scanf("%d",&T);
  60. for(int Case=1;Case<=T;++Case)
  61. {
  62. int n;
  63. scanf("%d%s",&n,s);
  64. len=strlen(s);
  65. for(int i=0;i<n-1;++i)
  66. {
  67. int pos=strlen(s);
  68. s[pos]='.';
  69. scanf("%s",s+pos+1);
  70. }
  71. tot=strlen(s);
  72. build();
  73. int tmp=0;
  74. a[0]=-1,b[tot-1]=-1;
  75. for(int i=1;i<tot;++i)
  76. {
  77. if(sa[i-1]<len)a[i]=a[i-1];
  78. else a[i]=i-1;
  79. if(sa[tot-i]<len)b[tot-i-1]=b[tot-i];
  80. else b[tot-i-1]=tot-i;
  81. }
  82. int ans=INF,ansp;
  83. for(int i=0;i<len;++i)
  84. {
  85. int pos=Rank[i],mLen;
  86. if(a[pos]==-1)mLen=lcp(pos,b[pos]);
  87. else if(b[pos]==-1)mLen=lcp(pos,a[pos]);
  88. else mLen=max(lcp(pos,b[pos]),lcp(pos,a[pos]));
  89. if(mLen+i>=len)break;
  90. mLen++;
  91. if(mLen<ans)ans=mLen,ansp=pos;
  92. if(mLen==ans&&pos<ansp)ansp=pos;
  93. }
  94. printf("Case #%d: ",Case);
  95. if(ans==INF)printf("Impossible\n");
  96. else
  97. {
  98. for(int i=0;i<ans;++i)printf("%c",s[sa[ansp]+i]);
  99. printf("\n");
  100. }
  101. }
  102. }

Gym 101194F Mr. Panda and Fantastic Beasts的更多相关文章

  1. [acm/icpc2016ChinaFinal][CodeforcesGym101194] Mr. Panda and Fantastic Beasts

    地址:http://codeforces.com/gym/101194 题目:略 思路: 这题做法挺多的,可以sam也可以后缀数组,我用sam做的. 1.我自己yy的思路(瞎bb的) 把第一个串建立s ...

  2. UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts

    题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...

  3. 2016 ACM-ICPC China Finals #F Mr. Panda and Fantastic Beasts

    题目链接$\newcommand{\LCP}{\mathrm{LCP}}\newcommand{\suf}{\mathrm{suf}}$ 题意 给定 $n$ 个字符串 $s_1, s_2, \dots ...

  4. 2016EC Final F.Mr. Panda and Fantastic Beasts

    题目大意 \(T(1\leq T\leq42)\)组数据,给定\(n(2\leq n\leq 50000)\)个字符串\(S_{i}(n\leq\sum_{i=1}^{n}S_{i}\leq 2500 ...

  5. Codeforces Gym 101775D Mr. Panda and Geometric Sequence(2017-2018 ACM-ICPC Asia East Continent League Final,D题,枚举剪枝)

    题目链接  ECL-Final 2017 Problem D 题意  给定$2*10^{5}$组询问,每个询问求$l$到$r$之间有多少个符合条件的数 如果一个数小于等于$10^{15}$, 并且能被 ...

  6. Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)

    题目链接  2016 EC-Final 题意  现在要找到数列中连续两个子序列(没有公共部分).要求这两个子序列本身内部没有重复出现的数.   求这两个子序列的长度的和的最大值. 首先预处理一下.令$ ...

  7. Gym - 101194F(后缀数组)

    Mr. Panda and Fantastic Beasts 题意 给出若干个字符串,找到一个最短的字典序最小的字符串且仅是第一个字符串的子串. 分析 对于这种多个字符串.重复的子串问题一般都要连接字 ...

  8. H - Mr. Panda and Birthday Song Gym - 101775H (动态规划)

    Mrs. Panda’s birthday is coming. Mr. Panda wants to compose a song as gift for her birthday. It is k ...

  9. hdu6007 Mr. Panda and Crystal 最短路+完全背包

    /** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...

随机推荐

  1. Gin框架系列03:换个姿势理解中间件

    什么是中间件 中间件,英译middleware,顾名思义,放在中间的物件,那么放在谁中间呢?本来,客户端可以直接请求到服务端接口. 现在,中间件横插一脚,它能在请求到达接口之前拦截请求,做一些特殊处理 ...

  2. Light of future-测试总结

    目录 1.描述项目的测试工作安排 2.测试工具选择和运用 3.测试用例文档pdf的github链接地址 4.测试体会 5.项目测试评述 发布界面 后台CRUD 归属班级 →2019秋福大软件工程实践Z ...

  3. AbstractQueuedSynchronizer概述

    AbstractQueuedSynchronizer 是一个用于在竞争资源(如多线程)时使用的同步器,它内部使用了一个int类型的字段status表示需要同步的资源状态, 并基于一个先进先出(FIFO ...

  4. Shiro 笔记

    功能 认证 授权 加密 session 管理 认证 Subject 是一个与系统交互的实体,可以是人,也可以是其他等 调用 SecurityUtils.getSubject()返回当前Subject, ...

  5. MySQL InnoDB存储引擎体系架构 —— 索引高级

    转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...

  6. 一、VMware Workstation 15中文破解版 下载与安装(附密钥)

    下载地址: 下载地址VMware Workstation Pro 15.5.0 Build 14665864https://download3.vmware.com/software/wkst/fil ...

  7. 拓扑排序入门详解&&Educational Codeforces Round 72 (Rated for Div. 2)-----D

    https://codeforces.com/contest/1217 D:给定一个有向图,给图染色,使图中的环不只由一种颜色构成,输出每一条边的颜色 不成环的边全部用1染色 ps:最后输出需要注意, ...

  8. 不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

    偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下. 题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级.举例,如数值 > ...

  9. Linux/UNIX 下终端复用利器 tmux

    简介 tmux 是一个终端复用器类自由软件,功能类似 GNU Screen,但使用 BSD 许可发布.用户可以通过 tmux 在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行,或多个 ...

  10. IE各版本CSS Hack(兼容性处理)语法速查表

    为了兼容IE各个版本,需要在CSS中添加额外的代码,比如以前常用的_width.之所以工作,是因为浏览器会忽略不能解析的样式规则,因此举个例子来说,把_width写在width下面,对于非IE浏览器会 ...