本文主要是介绍NOIP 2000 单词接龙ACC pascal程序加题解。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at 和 atide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数n (n<=20)表示单词数,以下n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度
输入输出样例
5
at
touch
cheat
choose
tact
a
23 (连成的“龙”为atoucheatactactouchoose)
说明
NOIp2000提高组第三题
var
a:array[0..21] of string;b,c:array[0..21] of longint;
l,n,i,j,k:longint;
s:string;
ss,max:longint;
procedure init;//输入。
begin
readln(n);//有多少单词n+1。
max:=0;
for l:=1 to n do
begin
readln(s);//输入并保存。
a[l]:=s;
b[l]:=length(s);
c[l]:=0;
end;
readln(s);//特殊处理最后一个。
ss:=length(s);
end;
procedure aa(ch:string);//开始接龙。
var
i,j,k:longint;
s1,s2:string;
begin
for i:=1 to n do
if c[i]<2 then
begin
s:=a[i];//记录a[i];
if length(ch)>=b[i]//判断。
then k:=b[i]-1
else k:=length(ch);
s1:='';//清空。
s2:='';
for j:=1 to k do
begin
s1:=ch[length(ch)+1-j]+s1;//首先加上ch[length(ch)+1-j]
s2:=s2+s[j];//加末尾
if s1=s2 then//如果相等就判断长度是否最大,然后继续。
begin
ss:=ss+b[i]-j;
if ss>max
then max:=ss;
inc(c[i]);
aa(a[i]);
dec(c[i]);
ss:=ss+j-b[i];
end;
end;
end;
end;
begin
init;//输入
aa(s);//s是最后一个单词。
writeln(max);//长度。。。
end.
这篇关于NOIP 2000 单词接龙ACC pascal程序加题解。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!