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 }
View Code
原文地址:https://www.cnblogs.com/Zzqf/p/11653785.html