你的师父去城里办一天事。你本可以度过轻松的一天,不用听他的唠叨。但他命令你在傍晚前做好甜甜圈面团。他非常喜欢甜甜圈,每天不吃几十个就活不下去。在这么美好的一天里,这真是个苦差事。
但上周,你偷听到了师父使用的一个魔法咒语。是时候尝试一下了。你对放在厨房角落的扫帚念了咒语。伴随着一道闪光,扫帚长出了两只胳膊和两条腿,活了过来。你命令它,它便从仓库里拿来面粉,开始揉面。咒语起作用了,它揉得可真快!
几分钟后,厨房的桌子上就堆起了高高的面团。这足够下周用了。“好,现在停下。”你命令道。但他没有停下来。救命!你不知道让他停下来的咒语!很快,厨房的桌子上就摆满了成百上千块面团,而他仍在尽其所能地快速工作。如果你现在不阻止他,你就会在塞满面团的厨房里窒息。
等等,师父不是把他的咒语写在笔记本上吗?你去了他的书房,找到了记录着停止咒语的笔记本。
但这并不是故事的结局。笔记本上写的咒语不易被他人阅读。他用一个塑料甜甜圈模型作为记录咒语的笔记本。他将甜甜圈模型的表面划分为网格(图 B.1),并填上字母(图 B.2)。他非常小心地隐藏了咒语,使得表面上的图案看起来毫无意义。但你发现他写这个图案时,使得咒语“出现”了不止一次(具体条件见下一段)。咒语不一定是自左向右书写的,而是可以沿着 8 个方向中的任意一个,即:自左向右、自右向左、自上而下、自下而上,以及 4 个对角线方向。
你应该能找到出现不止一次的最长字符串作为咒语。这里,如果甜甜圈上存在满足以下条件的方格序列,其对应的字符串相同,则认为该字符串出现不止一次:
- 每个方格序列自身不重叠。(两个不同的方格序列可以共享一些方格。)
- 这些方格序列从不同的方格开始,和/或走向不同的方向。
图 B.1:填入字母前的巫师甜甜圈,显示网格和 8 个可能的咒语方向
图 B.2:填入字母后的巫师甜甜圈
注意,满足第一个条件的回文串(即正读和反读都相同的字符串)会“出现”两次。
甜甜圈上的图案以字母矩阵的形式给出,如下所示:
ABCD EFGH IJKL
注意,甜甜圈的表面没有边界;图案的顶边和底边、左边和右边是分别相连的。可以存在比图案的垂直和水平长度都更长的方格序列。例如,在上述图案中,从字母 F 开始,向 8 个方向延伸的最长不自重叠序列对应的字符串如下:
FGHE FKDEJCHIBGLA FJB FIDGJAHKBELC FEHG FALGBIHCJEDK FBJ FCLEBKHAJGDI
请编写一个程序,在被甜甜圈面团窒息之前找到这个魔法咒语。
输入格式
输入由多个数据集组成。每个数据集的第一行包含两个整数 $h$ 和 $w$,表示图案的大小,随后是 $h$ 行,每行包含 $w$ 个从 A 到 Z 的大写字母,表示甜甜圈上的图案。你可以认为 $3 \le h \le 10$ 且 $3 \le w \le 20$。
输入以包含两个零的一行结束。
输出格式
对于每个数据集,输出魔法咒语。如果存在多个长度相同的最长字符串,则字典序最小的那个必须是咒语。已知咒语的长度至少为两个字母。如果找不到任何咒语,输出 0(零)。
样例
输入样例 1
5 7 RRCABXT AABMFAB RROMJAC APTADAB YABADAO 3 13 ABCDEFGHIJKLM XMADAMIMADAMY ACEGIKMOQSUWY 3 4 DEFG ACAB HIJK 3 6 ABCDEF GHIAKL MNOPQR 10 19 JFZODYDXMZZPEYTRNCW XVGHPOKEYNZTQFZJKOD EYEHHQKHFZOVNRGOOLP QFZOIHRQMGHPNISHXOC DRGILJHSQEHHQLYTILL NCSHQMKHTZZIHRPAUJA NCCTINCLAUTFJHSZBVK LPBAUJIUMBVQYKHTZCW XMYHBVKUGNCWTLLAUID EYNDCCWLEOODXYUMBVN 0 0
输出样例 1
ABRACADABRA MADAMIMADAM ABAC 0 ABCDEFGHIJKLMNOPQRSTUVWXYZHHHHHABCDEFGHIJKLMNOPQRSTUVWXYZ