今天下午有位童鞋写这个题用暴力得了50分,感觉十分不爽,于是过来找Kudo求救……碰巧旁边的JAF DTing……
于是他现学现卖,写了一个Trie树来解决~
[pascal 代码]
TYPE
LZY=RECORD
GOT:LONGINT;
NEXT:ARRAY['a'..'z'] OF LONGINT;
END;
VAR
T:ARRAY[1..1000000]OF LZY;
S:STRING;
N,M,I,TN,J,NOW:LONGINT;
PROCEDURE GETINTREE(S:STRING);
VAR
I,NOW:LONGINT;
BEGIN
NOW:=1;
FOR I:=1 TO LENGTH(S) DO
IF T[NOW].NEXT[S[I]]<>0 THEN NOW:=T[NOW].NEXT[S[I]] ELSE
BEGIN
INC(TN);
T[TN].GOT:=0;
FILLCHAR(T[TN].NEXT,SIZEOF(T[TN].NEXT),0);
T[NOW].NEXT[S[I]]:=TN;
NOW:=TN;
END;
INC(T[NOW].GOT);
END;
FUNCTION CHECK(S:STRING):LONGINT;
VAR
I,NOW:LONGINT;
BEGIN
NOW:=1;
FOR I:=1 TO LENGTH(S) DO
IF T[NOW].NEXT[S[I]]<>0 THEN NOW:=T[NOW].NEXT[S[I]] ELSE EXIT(0);
EXIT(T[NOW].GOT);
END;
BEGIN
TN:=1;
T[1].GOT:=0;
FILLCHAR(T[1].NEXT,SIZEOF(T[1].NEXT),0);
READLN(N);
FOR I:=1 TO N DO
BEGIN
READLN(S);
GETINTREE(S);
END;
READLN(M);
FOR I:=1 TO M DO
BEGIN
READLN(S);
WRITELN(CHECK(S));
END;
END.