zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    linux基础——虚拟机的创建及安装操作系统
    并发编程之多进程
    操作系统与进程(理论知识点)
    粘包
    socket-网络编程
    网络编程1
    网络编程
    异常
    元类
    反射与内置方法
  • 原文地址:https://www.cnblogs.com/Zzqf/p/11653785.html
Copyright © 2011-2022 走看看