Week12 CSP-M3 C - Gym 270437N
题目描述:
思路:
考虑一个字符,两种情况,A,B,
考虑两个字符,四种情况,AA,AB,BA,BB(其中AA,BB,满足要求)
考虑三个字符,八种情况,AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB(其中只有AAB和BBA 不满足情况)
考虑四个字符,还有必要考虑吗?没有了,因为任何形式的串,其子串除了BA,BBA,BBBA,AB,ABB,ABBB不满足情况,其他子串都能分割成两个长度为2或3的回文串
考虑五个字符,除了BA,BBA,BBBA,BBBBA,AB,AAB,AAAB,AAAAB之外,其他子串都能分割成两个长度为2或3或4的回文串
所以只有ABBBB和BAAAA这种子串不满足要求,其他都满足要求
代码:
#include <cstdio> #include <iostream> #include <string> using namespace std; typedef long long ll; ll N,ans; int main() { cin>>N; string s; cin>>s; int lastPos=0,abOrba=0; ans=(N-1)*N/2; for(int i=1;i<N;i++) { if(s[i]!=s[i-1]) { ans=ans-(i-lastPos); //BAAAAAAB,i=7,LastPos=1,AB,AAB,AAAB,AAAAB,AAAAAB,AAAAAAB,正好6个 lastPos=i; abOrba++; } } lastPos=N-1; for(int i=N-2;i>=0;i--) { if(s[i]!=s[i+1]) //ABBBBBBA,i=1,lastPos=7 { ans=ans-(lastPos-i); lastPos=i; } } ans+=abOrba; cout<<ans<<endl; return 0; }