CF135E Weak Subsequence(弱子串)

Weak Subsequence

题目描述

Little Petya very much likes strings. Recently he has received a voucher to purchase a string as a gift from his mother. The string can be bought in the local shop. One can consider that the shop has all sorts of strings over the alphabet of fixed size. The size of the alphabet is equal to k k k. However, the voucher has a string type limitation: specifically, the voucher can be used to purchase string s s s if the length of string’s longest substring that is also its weak subsequence (see the definition given below) equals w w w.

String a a a with the length of n n n is considered the weak subsequence of the string s s s with the length of m m m, if there exists such a set of indexes 1 ≤ i 1 ≤ i 2 ≤ ⋯ ≤ i n ≤ m 1\le i_{1}\le i_{2}\le \cdots \le i_{n}\le m 1i1i2inm , that has the following two properties:

a k = s i k a_k = s_{ik} ak=sik for all k from 1 1 1 to n n n
there exists at least one such k ( 1 ≤ k ≤ n ) k (1 \le k \le n ) k(1kn), for which i k + 1 – i k < 1 i_{k+1}–i_{k} < 1 ik+1ik<1
.
Petya got interested how many different strings are available for him to purchase in the shop.

解题:

一、先简单翻译一下

  • 原始的字符串 s s s:长为 n n n,由 k k k个字母表里的字母组成;
  • 子串 a a a:长为 m m m,是 s s s的子串;
  • 若 子串 a a a与字符串 s s s中的一个子序列相等,且 a a a i i i至少有一个元素不同,则称子串 a a a为弱子串。
  • 题目目标是统计 最长的弱子串 a a a 的长度 m m m 等于给定的值 w w w 的 原始字符串 s s s 的个数

二、找到弱子串存在的充要条件

弱子串 a a a 的定义与字符串 s s s中的一个子序列有关,这是“存在”的关系。
我们定义字符串 s s s中子串 a a a左侧为前缀为 i i i、右侧为后缀为 j j j。我们发现,那么如果前缀 i i i中包含子串 a a a的首字母,或者后缀 j j j中包含子串 a a a的尾字母,那么 a a a一定为弱子串。

三、界定弱子串是是否最长,即,找到最长弱子串

我们对弱子串的判断,是借助前缀和后缀中是否包含子串的首尾字母来实现的,但这是定性的分析。我们对其做定量的分析。

首先,从条件上来看,只要前缀或后缀中,有一个首字母或尾字母就可以满足要求。
如果,存在两个以上的字母,我们可以将前缀中,第二个出现的字母往右并入子串,或者将后缀中,第一个出现的字母往左并入子串。此时该子串仍为弱子串,且长度增加。
这验证了两件事:

  1. 前缀或后缀中存在两个以上的首字母或尾字母,则当前子串并非最长;
  2. 最长的子串前缀或后缀中有且只有一个首字母或尾字母。

第二条是我们寻找最长弱子串的条件。

四、求最长弱子串的长度,然后计算所有可能性

长弱子串的长度 m m m = n − m i n ( i , j ) n - min(i, j) nmin(i,j), 其中i为前缀长,j为后缀长。
在满足条件的所有可能中, m m m的值为 w w w,而 n n n i i i j j j的值受到
k k k的限制。分情况讨论前缀、后缀与中间子串的关系,即可求的答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值