Codeforces 1238 D. AB-string
Posted zzqf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1238 D. AB-string相关的知识,希望对你有一定的参考价值。
思维题 这次cf思维题好多啊
定义了good string 指一个串,其中每一个字符都属于一个长度>=2 的回文串的一部分。叫你求一个串中有几个good substring。
显然ab串 good string会更多。只要aba,bab,aa,bb等等很轻易可以满足
n个字符共有 n*(n-1)/2个不同位置的子串,我们反向考虑排除不是good string的部分。
首先想到ab,ba不是good string,再延申aaaaaaaaab,bbbbbbbbba,abbbbbbbb,baaaaaaaa,这一类,也都不是good string,且其中包含的同一的串的长度就是能从这部分中提取出来的非good string的数量。
所以就可以从前往后找前两种 非good string,再从后前找 后两种非 good string, 最后ab,ba这样的被减去了两次,再加上一次即可。
1 #include <bits/stdc++.h> 2 #define debug(x) cout << #x << ": " << x << endl 3 using namespace std; 4 typedef long long ll; 5 const int MAXN=2e5+7; 6 const int INF=0x3f3f3f3f; 7 8 int main() 9 { 10 ios::sync_with_stdio(false); 11 cin.tie(0); 12 int n; 13 string s; 14 cin>>n>>s; 15 ll ans=1ll*n*(n-1)/2; 16 int cur=1; 17 for(int i=1;i<s.size();++i) 18 { 19 if(s[i]==s[i-1]) 20 cur++; 21 else 22 { 23 ans-=cur; 24 cur=1; 25 } 26 } 27 cur=1; 28 for(int i=n-2;i>=0;--i) 29 { 30 if(s[i]==s[i+1]) 31 cur++; 32 else 33 { 34 ans-=cur; 35 cur=1; 36 } 37 } 38 for(int i=0;i<s.size()-1;++i) 39 if(s[i]!=s[i+1]) ans++; 40 cout<<ans<<endl; 41 return 0; 42 }
以上是关于Codeforces 1238 D. AB-string的主要内容,如果未能解决你的问题,请参考以下文章
Keyboard Purchase CodeForces - 1238E (状压)
Codeforces1238F. The Maximum Subtree(树形dp)
Codeforces Codeforces Round #484 (Div. 2) D. Shark