单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母(不是单词),请你计算以这个字母开头的长度最长的“龙”,每个单词最多在“龙”中出现两次。
要注意的是,两个单词接龙规则如下:
如果第一个单词的后面的连续若干字母与第二个单词前面的连续若干字母依次相同,则这两个单词可以接龙,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish。两个单词接成一条龙后,龙的长度要比两个单词的长度都长。例如单词 at 和 atide 接成一条龙后为atide,龙的长度与第二个单词相同,所以这两个单词不能接龙。而单词ababab和ababab,可以接成ababababab,但不能为ababab。接龙时,如果两个单词接龙后的单词有多种情况,要尽可能保证接龙后龙的长度最长。例如cabab和ababc,一定要接成cabababc,为而不是cababc输入格式 输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词(只含有大写或小写字母,长度不超过20),输入的最后一行为一个单个字符,表示“龙”开头的字母。
你可以假定以此字母开头的“龙”一定存在。
输出格式 只需输出以此字母开头的最长的“龙”的长度。
数据范围 n ≤ 20 n≤20 n≤20
输入样例:
5 at touch cheat choose tact a
输出样例:
23
提示 连成的“龙”为 atoucheatactactouchoose。
从数据范围 n < = 20 n<=20 n<=20可以考虑使用DFS算法,尝试所有以“龙”字母开头的单词进行接龙,在搜索中计算最长的“龙”的长度。
注意:
为了能快速判断出两个单词是否能够“接龙” ,可以预先将所有单词之间的关系g[i][j],g[i][j] = 3表示第i个单词和第j个单词可以接龙,且相同部分的长度为3。为了保证每个单词最多在“龙”中出现两次,可以使用used[i]记录单词使用次数,例如:used[i] = 2表示第i个单词使用了两次。