CodeForces - 1238D(思惟)

題意

https://vjudge.net/problem/CodeForces-1238Dios

若是一個字符串的每一個字母,屬於至少一個(長度大於1)的迴文串,則稱這個字符串爲good。c++

一個長度爲n的字符串s(只由字母A,B組成),問s的子串中有多少個good字符串spa

思路

發現只有XYX這種交錯的串或者XX…X纔多是good串。.net

直接作比較難,咱們考慮求不合法的串。blog

因此咱們先正着遍歷一遍字符串,找出XXXXY這種,即經過s[i]!=s[i-1]計算前面相同字符的個數,即爲不合法串的個數(XY,XXY,XXXY,XXXXY都不合法)ci

再倒着遍歷一遍,找出XYYYY這種,即經過s[i]!=s[i+1]計算後面相同字符的葛素,即爲不合法串的個數(XY,XYY,XYYY,XYYYY)字符串

但咱們也能夠發現,這樣作會把XY這種減兩遍,事實是正着算算成了XY,倒着算算成了YX,因此再遍歷一遍,把XY這種交錯的個數算出來。get

長度爲1的串確定不合法,因此用總的串(n-1+1)*(n-1)/2 減去上面不合法的狀況,再加上多減的XY。string

代碼

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int main()
{
    std::ios::sync_with_stdio(false);
    ll n;
    cin>>n;
    string s;
    cin>>s;
    ll ans=n*(n-1)/2,cnt=1;
    for(int i=1;i<n;i++)//XXXXY
    {
        if(s[i]==s[i-1]) cnt++;
        else ans-=cnt,cnt=1;
    }
    cnt=1;
    for(int i=n-2;i>=0;i--)
    {
        if(s[i]==s[i+1]) cnt++;
        else ans-=cnt,cnt=1;
    }
    for(int i=1;i<n;i++)
        if(s[i]!=s[i-1])
            ans++;
    cout<<ans<<endl;
    return 0;
}
相關文章
相關標籤/搜索