牛客网多校第一场-I题
题目大意:
给你一个只含abc的字符串,求出所有不同构的子串。同构的定义是指在所有的映射方案下不相同,例如abc可以映射为acb bac bca cab cba,这六个串是相互同构的。
同构解释:给定两个字符串s and t,判断它们是否是同构字符串。
同构字符串是指,s 中的字符可以被替换以得到 t。
字符串中同一个字符的所有出现位置必须被相同的字符替换,并且不改变其在原始字符串中的位置。不同的字符不能够被映射到相同的字符,但是一个字符可以映射到本身。
解题思路:因为串内字符只存在
所以我们暴力处理出原串的所有同构串,并重构一个包含原串所有同构的新串,新串的长度为原串的长度
那么对于这个问题就转化成了计算新串中不同的子串的个数,这个问题用SA或是SAM都可以解决
由于蒟蒻只会SA,下面的代码上的就是SA解题版.
在我们算出的不同(SA算出的是不同的子串,不是不同构!)的子串的中有两种串
第一类形如
只存在中的一种字符
除此以外的串都算作第二类
显然可知,对于第一类串,同构的串存在种,而对于第二类串,同构的串存在种
我们定义不同的串的个数为,第一类串的个数为
那么显然便可以得到我们所要的结果