Codeforces-1682 A: Palindromic Indices 【构造、找规律】

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,i1] 的这一部分,仍然对应于 [ n − i + 2 , n ] [n-i+2, n] [ni+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 sni+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==sni+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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值