FJNU摸底赛_acdream1683(KMP)

来源:互联网 发布:windows录音机 编辑:程序博客网 时间:2024/05/17 08:42

题意:

给出两个串;

求两个连接后;

能找出几个前缀等于后缀的;

如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;}elsej = 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;}


0 0
原创粉丝点击