Simpsons’ Hidden Talents HDU - 2594 (kmp)
题目链接:https://cn.vjudge.net/contest/163024#problem/J
题目大意:求第一个串前缀和第二串后缀的最大匹配个数。
input:
clinton
homer
riemann
marjorie
output:
0
rie 3
题目分析:将第二个作为主串,第一个串作为模式串进行匹配。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e4 + 100;
char str1[maxn], str2[maxn];
int Next[maxn];
void GetNext() {
int len = strlen(str2);
Next[0] = 0;
for(int i = 1; i < len; i++) {
int j = Next[i - 1];
while(j && str2[i] != str2[j]) j = Next[j - 1];
if(str2[i] == str2[j]) Next[i] = j + 1;
else Next[i] = 0;
}
}
int kmp() {
GetNext();
int len1 = strlen(str1), len2 = strlen(str2);
int ans = 0;
int j = 0;
for(int i = 0; i < len1; i++) {
while(j && str1[i] != str2[j]) j = Next[j - 1];
if(str1[i] == str2[j]) j++;
}
return j; //这里 直接返回j需要注意
//因为要匹配后缀,所以一定是到主串的最后才匹配到
}
int main()
{
while(~scanf("%s %s", str2, str1)) {
int v = kmp();
if(!v) {
printf("%d\n", v);
continue;
}
else {
for(int i = 0; i < v; i++)
printf("%c", str2[i]);
printf(" %d\n", v);
}
}
}