Codeforces 1238D. AB-string


傳送門

求合法的串看一眼很不可做

考慮一下總方案減去不合法方案

考慮如何求不合法的串,首先串中連續的相同字符一定是回文串的一部分

然后考慮 $AB$ 交錯的情況,發現對於某個 $A$ 它如果左右都有 $B$ 那么一定也是回文串的一部分

對於 $B$ 也是同理

那么只要考慮一段 $A$ 和一段 $B$ 連在一起的情況,發現當 $ABBBBB...$ 的時候,串是不合法的

當然 $BAAAAA...$ ,$AAAA...B$,$BBBB...A$ 也都是不合法的,其他情況顯然都是合法的

然后所有情況都考慮完了,計算不合法情況很簡單,直接看代碼吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=3e5+7;
int n;
ll Ans;
char s[N];
int main()
{
    n=read(); scanf("%s",s+1);
    int pre=1; Ans=1ll*n*(n-1)/2;
    for(int i=2;i<=n;i++)
    {
        if(s[i]==s[i-1]) continue;
        Ans++;//注意這里 Ans++ 是因為 'AB'或'BA' 之后會再次被減去
        Ans-=(i-pre);
        pre=i;
    }
    pre=n;
    for(int i=n-1;i>=1;i--)
    {
        if(s[i]==s[i+1]) continue;
        Ans-=(pre-i); pre=i;
    }
    printf("%lld\n",Ans);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM