Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 训练补题
  • Codeforces 刷题计划
  • 概率dp练习
  • dp专题练习
  • 数论练习
  • 搜索专题练习
  • 图论练习
  • 基础字符串练习
  • AtCoder练习
  • 题解们
  • solutions

    • POJ-3468
    • Gym102501J题解
    • Gym102483C(Circuit Board Design)题解
    • Gym102433G(Glow, Little Pixel, Glow)题解
    • Codeforces 578D
      • 非DP做法1
  • 训练补题

Codeforces 578D

# Codeforces 578D

出题人给的题解像💩一样

# 非DP做法1

为什么网上的题解都没有给出"仅当子串为ababab交替出现时会重复计算"这一解题关键的证明/思路?估计是我太菜了。

对于串sss,可以把连续相同的字符分在同一组,设组数为gcntgcntgcnt。

对于某一个组gig_igi​,我们考虑从其中去除一个字符,得到新的字符串kkk,再向其中加入一个字符得到新的串t(t≠s)t\ (t\ne s)t(t=s),有nm−size(gi)nm- size(g_i)nm−size(gi​)种。由于向组gj(i≠j)g_j(i\ne j)gj​(i=j)中任意一个位置添加字符char(gj)char(g_j)char(gj​)得到的串ttt都是相同的,要减去重复计算的数,因此有ans=nm−size[gi]+∑j≠isize(gj)=nm−nans=nm-size[g_i]+\sum_{j\ne i}size(g_j)=nm-nans=nm−size[gi​]+∑j=i​size(gj​)=nm−n

总的答案即为ans=k(nm−n)ans=k(nm-n)ans=k(nm−n)


以下证明完全是自找苦吃,还不一定正确


下面考虑特殊字符串导致重复计算的情况。

对于一个串s=...a...b...s=...a...b...s=...a...b...,将省略部分分别记为l、m、rl、m、rl、m、r。

从sss中分别去掉字符a、ba、ba、b得到k、k′(k≠k′)k、k'\ (k\ne k')k、k′(k=k′),然后向k、k′k、k'k、k′中分别添加一个新字符c1、c2c_1、c_2c1​、c2​得到t,t′(t≠r&t′≠r)t,t'\ (t\ne r\ \&\ t'\ne r)t,t′(t=r&t′=r),若重复计算,说明t=t′t=t't=t′,

  1. 若a=ba=ba=b,则k={lmar},k′={lamr},k≠k′k=\{lmar\},k'=\{lamr\},k\ne k'k={lmar},k′={lamr},k=k′

    1. (无证明)仅当m={ca}(c≠a)m=\{ca\}\ (c\ne a)m={ca}(c=a)循环时t=t′t=t't=t′
  2. 若a≠ba\ne ba=b,则k={lmbr},k′={lamr},k≠k′k=\{lmbr\},k'=\{lamr\},k\ne k'k={lmbr},k′={lamr},k=k′

    ​ 显然字符c1c_1c1​或c2c_2c2​被添加到l/rl/rl/r中时,由于不存在有限长的字符串mmm使得am=mbam=mbam=mb(或因为k≠k′k\ne k'k=k′),因此定有t≠t′t\ne t't=t′,因此忽略l、rl、rl、r,考虑子串s=a...bs=a...bs=a...b,被省略部分记为mmm。记k={mb},k′={am}k=\{mb\}, k'=\{am\}k={mb},k′={am}。

    ​ 同理,当字符被添加进mmm中时,不存在有限长的字符串m=m1m2=m1′m2′m=m_1m_2=m_1'm_2'm=m1​m2​=m1′​m2′​使得am1c1m2=m1′c2m2′bam_1c_1m_2=m_1'c_2m_2'bam1​c1​m2​=m1′​c2​m2′​b

    1. 若c1,c2≠a&c1,c2≠bc_1,c_2\ne a\ \&\ c_1,c_2\ne bc1​,c2​=a&c1​,c2​=b,显然t≠t′t\ne t't=t′
    2. 若c1=b,c2=ac_1=b,c_2=ac1​=b,c2​=a,不存在mmm使t=t′t=t't=t′
    3. 若c1=a,c2=bc_1=a, c_2=bc1​=a,c2​=b,唯一可行的解为t={mab},t′={abm}t=\{mab\},t'=\{abm\}t={mab},t′={abm}。易得mmm为{ab}\{ab\}{ab}循环
    4. 若c1=c2c_1=c_2c1​=c2​,不存在mmm使t=t′t=t't=t′

结论:当且仅当字符串ababab交替出现(ab...a或ab....ab)时会重复计算,且只会被重复计算1次。

最终答案ans=k(mn−n)−字符交替出现的子串数量ans=k(mn-n)-字符交替出现的子串数量ans=k(mn−n)−字符交替出现的子串数量

下面是从大佬那copy来的代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,m,same; char c1,c2;
signed main(){
    scanf("%d%d",&n,&m);
    while (!isalpha(c1)) c1=getchar();
    rr long long ans=n*(m-1);
    for(rr int i=1;i<n;++i){
        rr char c=getchar();
        same=(c==c2)?same+1:0;
        if(c!=c1) ans+=n*(m-1)-same-1;
        c2=c1; c1=c;
    }
    return !printf("%lld",ans);
} 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上次更新: 2021/02/24, 03:37:30
Gym102433G(Glow, Little Pixel, Glow)题解
训练补题-个人1

← Gym102433G(Glow, Little Pixel, Glow)题解 训练补题-个人1→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式