标签:kmp
题意:有两个夫妻,名字分别是a和b两个字符串,然后给孩子起名字,名字可以是父亲的名字前缀和母亲名字后缀相等的那部分,问可以给孩子起多少个名字。
题解:kmp中的next[i]数组记录了前i个字符前缀与后缀相等的长度是多少,那么可以利用这个特性,先把a和b拼接起来总长度是len,然后得到next数组,从next[len]往前找,前缀与后缀相等的串中是否还有前后缀相等串存在,一直到next[i] = 0,结果加1因为a和b拼接起来的本身串也符合条件。
#include <stdio.h> #include <string.h> char str[200005]; int next[200005], len; void getnext() { int pp = -1, k = 0; next[0] = -1; while (k < len) { if (pp == -1 || str[pp] == str[k]) { k++; pp++; next[k] = pp; } else pp = next[pp]; } } int solve(int x) { if (x == 0) return 0; return 1 + solve(next[x]); } int main() { int t; scanf("%d", &t); while (t--) { memset(next, 0, sizeof(next)); scanf("%s", str); scanf("%s", str + strlen(str)); len = strlen(str); getnext(); printf("%d\n", solve(next[len]) + 1); } return 0; }
标签:kmp
原文地址:http://blog.csdn.net/hyczms/article/details/45066657