[计数] QOJ7416 Grammarly
posted on 2025-10-14 12:46:15 | under | source
题意:给你一个字符串 \(s\),每次丢掉左边或右边一个字符,做任意次,将这个过程记下来得到一个字符串序列,求本质不同的序列个数。要求 \(O(n)\) 复杂度。
一开始以为是字符串科技题,实际上直接数数就行了。
注意到子串 \([1,n)\) 和 \((1,n]\) 不同,当且仅当 \([1,n]\) 字符不全相同。那么在 \(s\) 变成全同串之前任意操作都不会相同,而变成全同串显然好算。
对于变成全同串是好做的,因为拎出所有连续段,考虑从非全同串变成全同串,其中一端必为连续段一端,这样总情况数是 \(O(n)\) 的。算方案就多重排列。
但你可以容斥,用 \(2^{|S|}-1\) 减去重复方案数,就没了。

浙公网安备 33010602011771号