正题
ybtoj KMP-4
题目大意
给出字符串S,问你有多少个子串满足ABA的形式,且∣A∣⩾k,∣B∣⩾1|A|\geqslant k,|B|\geqslant 1∣A∣⩾k,∣B∣⩾1
解题思路
可以先枚举左端点,然后跑KMP,使其满足左右两个A,然后判断A,B是否满足条件,然后计算答案
时间复杂度O(n2)O(n^2)O(n2),理论上是过不了的,但它就是过了,题解还是这么写的
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 15010
using namespace std;
int k, n, ans, nx[N];
char s[N];
void kmp(char* s)
{int n = strlen(s+1); nx[1] = 0;for (int i = 2, j = 0; i <= n; ++i){while (s[i] != s[j + 1] && j) j = nx[j];if (s[i] == s[j + 1]) j++;nx[i] = j;}for (int i = 2, j = 0; i <= n; ++i){while (s[i] != s[j + 1] && j) j = nx[j];if (s[i] == s[j + 1]) j++;if (i - j <= j) j = nx[j];//|B|⩾0if (j >= k) ans++;}return;
}
int main()
{scanf("%s%d", s+1, &k);n = strlen(s+1);for (int i = 0; i < n - k * 2; ++i)kmp(s + i);printf("%d", ans);return 0;
}