题意:
给出两个串;
求两个连接后;
能找出几个前缀等于后缀的;
如ababc abaaba
前缀a 后缀a 前缀aba 后缀aba还有整串;
一共3个;
思路:
用KMP求出next数组;
然后先判断最后一位的next,它的值就是最大的前缀和后缀相同的长度;这时候比如前4个和后4个相同了,那么如果还有前后缀相同,前缀长度肯定是小于4,那我们直接那找第四位的next就行了;
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
char s1[2 * N];
char s2[N];
int next[N];
void get_next(char s[],int next[]) {
int i,j;
i = 0 ;
j = -1;
next[0] = -1;
int len = strlen(s);
while(i < len){
if(j == -1 || s[i] == s[j]) {
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int sum(int x){
if(x == 0)
return 0;
return 1 + sum(next[x]);
}
int main() {
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s",s1,s2);
strcat(s1,s2);
int len = strlen(s1);
get_next(s1,next);
printf("%d\n",sum(len));
}
return 0;
}