Codeforces-1682 A: Palindromic Indices
题目传送门:Codeforces-1682 A
题目
题目截图
样例描述
题目大意
给定一个镜像串 s s s,问有多少个下标 i i i,满足从 s s s 中删掉 s i s_i si 后,剩余的部分仍然是镜像串?
题目解析
首先要注意到题目给定的是镜像串。之后,我们看看删掉 s i s_i si 后剩余部分仍保持镜像的条件。首先,对于下标在 [ 1 , i − 1 ] [1,i-1] [1,i−1] 的这一部分,仍然对应于 [ n − i + 2 , n ] [n-i+2, n] [n−i+2,n] 的部分,仍然是镜像的。而 s i s_i si 被去掉以后, s i + 1 s_{i+1} si+1 对应为原本 s i s_i si 应对应的 s n − i + 1 = s i s_{n-i+1}=s_i sn−i+1=si,这意味着,若删除后仍是镜像串,那么 s i = s i + 1 s_i=s_{i+1} si=si+1。依此类推,我们可以知道 s i = s i + 1 = ⋯ = s n − i + 1 s_i=s_{i+1}=\cdots =s_{n-i+1} si=si+1=⋯=sn−i+1。可见这是一个一定包含有 s s s 中间字符的等式,因此,我们只要从中间字符开始,判断左右一共有几个连续相等的字符即可。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
int t, n;
string s;
cin >> t;
while(t--) {
cin >> n;
cin >> s;
int k = n / 2, ans = 1;
for(int i=k+1; i<n; ++i)
if(s[k] == s[i]) ++ans; else break;
for(int i=k-1; i>=0; --i)
if(s[k] == s[i]) ++ans; else break;
cout << ans << endl;
}
return 0;
}