题目传送门
题目大意
题目描述
您将得到一个数字
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;
}
并集矩阵
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
⋃
\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
⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃⋃