简单的KMP算法。
ac代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 50002;
char str1[N];
char str2[N];
int next[N];
void get_next(int len_1);
int kmp_search(int len_1, int len_2);
int main()
{
int len;
while(scanf("%s%s", str1, str2) != EOF)
{
int len_1 = strlen(str1);
int len_2 = strlen(str2);
get_next(len_1);
len = kmp_search(len_1, len_2);
if(len == 0)
{
printf("0\n");
}
else
{
for(int i = 0; i < len; i++)
{
printf("%c", str1[i]);
}
printf(" %d\n", len);
}
}
return 0;
}
void get_next(int len_1)
{
int i = 0;
int j = -1;
next[i] = -1;
while(i < len_1)
{
if(j == -1 || str1[j] == str1[i])
{
i++;
j++;
if(str1[i] == str1[j])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
}
}
int kmp_search(int len_1, int len_2)
{
int i = 0;
int j = 0;
while(i < len_2)
{
if(j == -1 || str1[j] == str2[i])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j == -1)
{
return 0;
}
if(j == 0)
{
if(str1[0] == str2[len_2 - 1])
{
return 1;
}
else
{
return 0;
}
}
else
{
return j;
}
}