题目描述
有一个字符串只有 0
和 1
组成,对于某个子串,如果将 0
和 1
互换并且倒过来与原子串相同,则认为该子串是"反对称"的。给出一个长度为 NN 的字符串,那么有多少个子串是"反对称"的?
输入格式
第一行一个正整数 N(0\le N\le 10000)N(0≤N≤10000)
第二行包括一个长度为 NN 的 01
串。
输出格式
输出"反对称"子串的个数。
样例
输入数据#1
8
11001011
Copy
输出数据#1
7
Copy
解释#1
共 77 个反对称子串: 1100
(0-3)、10
(1-2)、01
(3-4)、10
(4-5)、01
(5-6)、0101
(3-6)、001011
(2-7)。
解析
反对称的子串长度一定是偶数,不会是奇数(奇数01互换后中心位置无法相同)。
所以我们可以枚举每个两个数字的中心位置,然后双指针枚举左右端点,如此时间复杂度为 O(n^2)O(n2)。
代码如下:
// from dingyunhan
#include<bits/stdc++.h>
using namespace std;
int n,i,j,k;
char c;
int a[10005];
int main()
{
cin >> n;
for(i = 1;i <= n;i++)
{
cin >> c;
a[i] = c - '0';
}
int s = 0;
for(i = 1;i < n;i++)
{
if(a[i] + a[i+1] == 1) // 01 or 10
{
s++;
for(j = i - 1,k = i + 2;j >= 1 && k <= n;j--,k++)
{
if(a[j] + a[k] == 1) // 0+1 or 1+0
{
s++;
}
else
{
break;
}
}
}
}
cout << s;
}