题意:

n<=100 len[i]<=1000

思路:这是一道论文题

 var a,x,y,sa,rank,height,wc,wd,ans,flag,b:array[..]of longint;
ch:array[..]of ansistring;
n,n1,l,r,mid,last,i,j,m,len:longint; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; function cmp(a,b,l:longint):boolean;
begin
exit((y[a]=y[b])and(y[a+l]=y[b+l]));
end; procedure getsa(n:longint);
var i,j,p:longint;
begin
for i:= to n- do
begin
x[i]:=a[i];
inc(wc[x[i]]);
end;
for i:= to m- do wc[i]:=wc[i-]+wc[i];
for i:=n- downto do
begin
dec(wc[x[i]]);
sa[wc[x[i]]]:=i;
end;
j:=; p:=;
while p<n do
begin
p:=;
for i:=n-j to n- do
begin
y[p]:=i; inc(p);
end;
for i:= to n- do
if sa[i]>=j then begin y[p]:=sa[i]-j; inc(p); end;
for i:= to n- do wd[i]:=x[y[i]];
for i:= to m- do wc[i]:=;
for i:= to n- do inc(wc[wd[i]]);
for i:= to m- do wc[i]:=wc[i-]+wc[i];
for i:=n- downto do
begin
dec(wc[wd[i]]);
sa[wc[wd[i]]]:=y[i];
end;
for i:= to n do swap(x[i],y[i]);
p:=; x[sa[]]:=;
for i:= to n- do
if cmp(sa[i-],sa[i],j) then x[sa[i]]:=p-
else begin x[sa[i]]:=p; inc(p); end;
j:=j*;
m:=p;
end;
end; procedure getheight(n:longint);
var i,j,k:longint;
begin
for i:= to n do rank[sa[i]]:=i;
k:=;
for i:= to n- do
begin
if k> then dec(k);
j:=sa[rank[i]-];
while a[i+k]=a[j+k] do inc(k);
height[rank[i]]:=k;
end;
end; function isok(x:longint):boolean;
var i,j,cnt,s:longint;
begin
for i:= to n1 do flag[i]:=;
cnt:=; s:=;
for i:= to n do
if height[i]>=x then
begin
cnt:=cnt+flag[b[sa[i]]]; flag[b[sa[i]]]:=;
cnt:=cnt+flag[b[sa[i-]]]; flag[b[sa[i-]]]:=;
end
else
begin
if cnt>n1 div then begin inc(s); ans[s]:=sa[i-]; end;
cnt:=;
for j:= to n1 do flag[j]:=;
end;
if cnt>n1 div then begin inc(s); ans[s]:=sa[n]; end;
if s> then
begin
ans[]:=s;
exit(true);
end;
exit(false);
end; procedure init;
var i:longint;
begin
{for i:=0 to n+1 do
begin
a[i]:=0; x[i]:=0; y[i]:=0;
sa[i]:=0; rank[i]:=0; ans[i]:=0;
wc[i]:=0; wd[i]:=0; b[i]:=0;
height[i]:=0;
end; }
fillchar(a,sizeof(a),);
fillchar(b,sizeof(b),);
fillchar(x,sizeof(x),);
fillchar(y,sizeof(y),);
fillchar(sa,sizeof(sa),);
fillchar(rank,sizeof(rank),);
fillchar(ans,sizeof(ans),);
fillchar(wc,sizeof(wc),);
fillchar(wd,sizeof(wd),);
fillchar(height,sizeof(height),);
end; begin
assign(input,'poj3294.in'); reset(input);
assign(output,'poj3294.out'); rewrite(output);
while not eof do
begin
init;
readln(n1);
if n1= then break;
n:=;
for i:= to n1 do
begin
readln(ch[i]);
len:=length(ch[i]);
for j:=n to n+len- do
begin
a[j]:=ord(ch[i][j-n+])+;
b[j]:=i;
end;
n:=n+len; a[n]:=i;
inc(n);
end;
dec(n); a[n]:=; m:=;
getsa(n+);
getheight(n); l:=; r:=n; last:=;
while l<=r do
begin
mid:=(l+r)>>;
if isok(mid) then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
if last= then writeln('?')
else
begin
for i:= to ans[] do
begin
for j:=ans[i] to ans[i]+last- do write(chr(a[j]-));
writeln;
end;
end;
writeln;
end;
close(input);
close(output);
end.

最新文章

  1. Wave - 花たん 音乐
  2. iOS 使用Block进行逆传值
  3. lodop打印控件一点记录
  4. js中==, !==, === ,!=的区别
  5. 使用BeanUtils操作Bean属性
  6. ios关于layer的一些常用属性
  7. 《Data-Intensive Text Processing with mapReduce》读书笔记之一:前言
  8. [React] React Fundamentals: Component Lifecycle - Mounting Basics
  9. -_-#【Canvas】measureText, translate, drawImage
  10. Ado.net对象
  11. Java中随机数生成的两种方法,以及math的floor
  12. Swift_字符串详解(String)
  13. Android下Json数据解析
  14. Windows 运行命令大全,装逼必备哦!
  15. Python学习基础笔记(全)
  16. Day048--jQuery自定义动画和DOM操作
  17. moment.js
  18. java调用第三方的webservice应用实例【转载】
  19. Windows7安装CodeTyphon
  20. ZOJ2417 Lowest Bit 2017-04-18 20:53 38人阅读 评论(0) 收藏

热门文章

  1. ubuntu中mysql安装失败
  2. 《Head First HTML与CSS》的CSS属性
  3. Android CursorAdapter的使用
  4. apropos命令
  5. PowerBI 应用时间智能(生成日期表)
  6. DHCP server工作原理
  7. [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)
  8. 微信公众号:theTree20181123
  9. python之int (整型)
  10. C++ new delete(二)