感谢www.100xinxi.com为我提供数据。
[报告]
这道题目比较猥琐——反正提交了N+次,后来一找数据,一测,发现全错了,只好重写。
思路比较简单。
中心思想:DP
算法过程:
先是复制字母表DIC -》 AN,
然后把字典的字母全换成数字 CHECK 函数(我加了个没用的优化,就是把不可能的词语给删了。反正没用,自己在INIT里看看吧,我不讲了)
接着在母串中寻找词语FOUND函数,实际上是源自于KMP算法,找到所有可能可以放这个词语的地方假定它为J,那么M[J,LENGTH(DIC)]:=AN;F[J,LENGTH(DIC)]:=1;
然后是DP 过程。
这个方程就是:F[I,J+K]=F[I,J]+F[I+J,K];M[I,J+K]=M[I,J]+‘ ’+M[I+J,K];
条件就是: (i+j+k<=len+1)and
(m[i+j,k]<>'')and(m[i,j]<>'')and
((f[i,j+k]>f[i,j]+f[i+j,k])or
(f[i,j+k]=f[i,j]+f[i+j,k])and(m[i,j]+' '+m[i+j,k]>m[i,j+k]))
最后答案就是F[1,LEN](不过我为了保险,就是用找全部的方法,其实没有什么用处的。)
终于结束了这道非常委琐的题目。以后URAL的路还长着呢……
程序:
// TASK: Phone numbers
const
alp:array ['a'..'z'] of char=('2','2','2','3','3',
'3','4','4','1','1',
'5','5','6','6','0',
'7','0','7','7','8',
'8','8','9','9','9','0');
var
nu,d:string;
n,len,anf,dl:longint;
flag:boolean;
dic,an:array [0..50000] of string;
pre:array [0..100] of longint;
hash:array ['0'..'9'] of boolean;
i,j,k:longint;
m:array [0..100,0..100] of string;
ans:string;
f:array [0..100,0..100] of longint;
function found(b:longint;var p,t:string):longint;
var
i,j,k:longint;
begin
// exit(pos(p,copy(t,b,sizeof(t))));
fillchar(pre,sizeof(pre),0);
pre[1]:=0;
k:=0;
for i:=2 to length(p) do
begin
while (k>0)and(p[k+1]<>p[i]) do k:=pre[k];
if p[k+1]=p[i] then inc(k);
pre[i]:=k;
end;
{ write('pre:');
for i:=1 to length(p) do
write(pre[i]:3);
writeln; }
k:=0;
for i:=b to length(t) do
begin
while (k>0)and(p[k+1]<>t[i]) do k:=pre[k];
if p[k+1]=t[i] then inc(k);
if k=length(p) then exit(i-length(p)+1);
end;
exit(-1);
end;
procedure init;
var
i,j,k:longint;
flag:boolean;
function check(var s:string):boolean;
var
i,j,k:longint;
begin
if length(s)>len then exit(false);
for i:=1 to length(s) do
begin