这种东西见过一两次了,稍微口胡一下吧。
定义
什么是最小等价串?
可以理解为把一个字符串中的字符按顺序重新“编号”。
比如说一个字符串S=BBCBA
,那么它的最小表示就是T=AABAC
。
问题
快速判断两个串是否等价(即最小等价串相同)
解析
我们发现问题就在于这个字符可以随便搞,这样随便怎样都会挂。
怎么办呢?能不能反过来利用这个东西?
注意到我们不关心每一种字符具体是什么,只关心它们在哪里出现了。
那么我们可以考虑记last[i]
表示字符i
上一次出现的位置,第$1$次出现则记为$0$。
不难发现,只要两个字符串对应的i-last[i]
相同,它们就是等价的。
比如说字符串S=BBCBA
:
Source String | B | B | C | B | A |
---|---|---|---|---|---|
LAST | 0 | 1 | 0 | 2 | 0 |
i-LAST | 1 | 1 | 3 | 2 | 5 |
字符串T=AABAC
:
Source String | A | A | B | A | C |
---|---|---|---|---|---|
LAST | 0 | 1 | 0 | 2 | 0 |
i-LAST | 1 | 1 | 3 | 2 | 5 |
说明S
和T
是等价的。
而对于SS=AAABC
来说:
source String | A | A | A | B | C |
---|---|---|---|---|---|
LAST | 0 | 1 | 2 | 0 | 0 |
i-LAST | 1 | 1 | 1 | 4 | 5 |
说明SS
与S,T
是不等价的。
对不对?WO YE BU HUI。