题目传送门
题目大意
题目描述
您将得到一个数字 k k k 和一个长度不超过 30000 30000 30000 个小写字母的非空字符串 S S S。
我们说两个回文串是不同的仅为回文串的开始位置不同。请你求出 S S S 包含多少个长度为 k k k 的不同的回文串?
数据范围
令 ∣ S ∣ |S| ∣S∣ 为字符串 S S S 的长度。
对于 100 % 100\% 100% 的数据满足, 2 ≤ k ≤ 3 × 1 0 4 , 1 ≤ ∣ S ∣ ≤ 3 × 1 0 4 2 \leq k \leq 3\times 10^4,1\le|S|\le3\times10^4 2≤k≤3×104,1≤∣S∣≤3×104, S S S 只包含小写字母。
解题思路
令子串的起始位置为 l l l,结束位置为 r r r。
如果同时枚举 l l l 与 r r r 的话是两层循环,再加上一层判断是否为回文串的循环,时间复杂度为 O ( n 3 ) O(n^3) O(n3),很明显是会超时的。
因此,我们尝试只枚举每个子串的起始位置 l l l,可以发现结束位置一定为 i + k − 1 i + k - 1 i+k−1 即 r = i + k − 1 r = i + k - 1 r=i+k−1。我们都知道回文串满足从前往后看与从后往前看相同,所以我们就可以从起始位置 l l l 向后出发,同时从结束位置 r r r 向前出发,如果 a l ≠ a r a_l \neq a_r al=ar 的话,说明这个子串不是回文串,否则继续上述操作,直到 l ≥ r l\geq r l≥r 停止。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int k, len, ans;
char str[30010];
int main() {
scanf("%d%s", &k, str);
len = strlen(str);
for (int i = 0; i <= len - k; i++) {
int s = i, e = i + k - 1;
bool flag = 0;
while (s < e) {
if (str[s++] != str[e--]) {
flag = 1;
break;
}
}
if (!flag)
ans++;
}
printf("%d\n", ans);
return 0;
}
latex 拓展之并集符号 bigcup
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃
⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ ⋃ \bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup\bigcup ⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃