kmp + 区间覆盖
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
char s[N], p[N];
int ne[N];
int check[N];
int idx = 0;
int main()
{
cin >> s + 1 >> p + 1;
int n = strlen(s + 1);
int m = strlen(p + 1);
for (int i = 2, j = 0; i <= m; i++)
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j++;
ne[i] = j;
}
for (int i = 1, j = 0; i <= n; i++)
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j++;
if (j == m)
{
check[++idx] = i - m + 1;
j = ne[j];
}
}
int prev = 0;
bool f = true;
for (int i = 1; i <= idx; i++)
{
if (check[i] > prev + 1)
{
f = false;
break;
}
prev = check[i] + m - 1;
}
if (f && prev >= m) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
} 
京公网安备 11010502036488号