娜娜与村民交流了好久才发现这里的人们给孩子的命名方式很奇怪,首先村民们的名字都是用专门的符号来记录,正好是26个符号,于是娜娜就把它们替换成‘a’~‘z’,然后首先把爸爸的名字作为孩子的姓,妈妈的名字作为孩子的名。这时候肯定有人会问,不是独生子女怎么办?很简单~取拼接好的名字的前缀与后缀相同的部分从短到长依次作为孩子的姓名,啥,不够?那就不许你再生孩子!
不过由于桃花村民与世隔绝太久了,以致于他们总是无法正确判断一对夫妻最多能生多少个孩子,于是就把这个任务交给你了。
P.S. 若用S[1,n]表示一个长度为n的字符串,那么S[1,i](1<=i<=n)表示S的一个前缀,S[j,n](1<=j<=n)表示S的一个后缀。具体看样例解释
对于样例1,把丈夫和妻子的姓名拼接在一起是ababcababa,可以作为孩子的姓名的是a、aba、ababcababa,故最多生育3个孩子
对于样例2,把丈夫和妻子的姓名拼接在一起是aaaaaaaa,可以作为孩子的姓名的是a、aa、aaa、aaaa、aaaaa、aaaaaa、aaaaaaa、aaaaaaaa,故最多生育8个孩子。
next[i]表示以i为结尾的最长公共前后缀的长度。
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int Next[200000+5];
void getnext(int n,string str)
{
int i,j;
i = 0,j = -1;
Next[i] = j;
while( i < n)
{
if(j==-1 || str[i] == str[j])
{
i++;
j++;
Next[i] = j;
}
else j = Next[j];
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
string str,tmp;
cin>>str>>tmp;
str += tmp;
int len = str.length();
getnext(len,str);
int ans = 0, now = len;
while( now!=-1 && Next[now]!=-1)
{
ans++;
now = Next[now];
}
printf("%d\n",ans);
}
return 0;
}