usaco1.2 namenum 2008.11.5
{Tips:
1.对字典序的理解错误:eg:ABC ABU ACE 第二位是B时,第三位从小到大都排完后,第二位才排C。我理解错了。我以为是前面的字符串的每一位都大于后面字符串的相应位,这种理解是错误的。要注意读题的准确
2.用了一个滚动数组,循环来纪录每次筛选的字符串。
3.要求找出所有符合条件的结果,我只找出了一组就跳出循环了。
4.存储每个数字代表哪个字母时,借鉴了结题报告,又有所改进。
5.从第一位开始筛选,如果不符合相应的条件,直接筛掉,不再进行接下来的处理
6.文件名打错了,‘namenum.out’我打成了‘namenum.out;’多了个分号,一直出错 }
{
ID:
PROG: namenum
LANG: PASCAL
}
program kakashi;
const
x:array[2..9,1..3]of char=(('A','B','C'),('D','E','F'),('G','H','I'),('J',
'K','L'),('M','N','O'),('P','R','S'),('T','U','V'),('W','X','Y'));
y:array['0'..'9']of 0..9=(0,1,2,3,4,5,6,7,8,9);
type
arr=array[1..12]of 0..9;
var
f1,f2,ff:text;
r,i,j,n,la,lb,k,mm,m:longint;
t:arr;
l:integer;
flag,sign:boolean;
ch,answer,p:string;
z:array[0..1,1..5000]of string;
procedure deal(dep,m:longint);
var
l1,l2,o:longint;
begin
if (dep=l+1) then
begin
if m=0 then writeln(f2,'NONE') else
for o:=1 to m do
writeln(f2,z[k,o]);
exit;
end;
mm:=0;
for r:=1 to m do
if (z[k,r,dep]in[x[t[dep],1],x[t[dep],2],x[t[dep],3]])
then begin
inc(mm);
z[1-k,mm]:=z[k,r];
end;
k:=1-k;
deal(dep+1,mm);
end;
begin
assign(f1,'namenum.in');
reset(f1);
assign(f2,'namenum.out');
rewrite(f2);
assign(ff,'dict.txt');
reset(ff);
readln(f1,p);
l:=length(p);
for i:=1 to l do
t[i]:=y[p[i]];
n:=0;
repeat
readln(ff,ch);
flag:=true;
if (length(ch)=l) then
if (ch[1] in[x[t[1],1],x[t[1],2],x[t[1],3]])then
begin
inc(n);
z[1,n]:=ch;
end;
until((eof(ff))or(ch[1]>x[t[1],3]));
k:=1;
deal(2,n);
close(f1);
close(f2);
close(ff);
end.