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; }