这套题是tourist出的,难度挺大。题解吗,tourist写得很详细了,我就大概写一下要点好了。
tourist的题解 http://codeforces.com/blog/entry/451
A,B水题
C 题目大意:对字符串定义一种操作,对于两个相邻的字符,令其值相等,即用后者的值取代前者先前的值,或者用前者的值取代后者先前的值。
定义平衡串,令|x|表示字符x在串中出现的次数,则若对于任意的字符a,b满足-1<=|a|-|b|<=1,该字符串则为平衡串。
对于一个给定长度的仅含’a’,’b’,’c’三种字符的字符串,求通过上述操作能得到多少个平衡串。
对于字符串S,用S’表示其的压缩串,压缩串即为将原字符串连续的相同字符压缩成单个字符后的串,比如,字符串aabbcc的压缩串为abc。
字符串A在操作后能变成B,则有事实:B’一定为A’的一个子序列。反之亦然。
则做法就是通过根据B’是A’子序列,通过A’构造B。
令状态F[I][A][B][C]表示,构造到了A’的第I个元素,|a|,|b|,|c|分别等于A,B,C。时构造出的B的数目。定义nxt[i][x] =min{j | j >= i && s[j] = x},即要添加字符x,需要到的下一个位置。
若添加字符’a’,则F[I][A][B][C]能转移到F[ nxt[i][ ‘a’ ]][A+1][B][C]。
添加’b’, ’c’与之类似。
在求每个状态的时候判断一下能否满足平衡条件,统计答案即可。
D 题目要点:给定两个大数A和B以及一个32位数C求出AB mod C
数论题,单说一下要用到的知识,欧拉定理,以及剩余系。
E 大意:求出一个给定字符串中,有共同元素的回文子串对的个数。
首先用求最长回文子串的线性算法。然后根据其辅助数组求得开始于一点的回文子串的数组start,以及结束于一点的回文子串的数组finish。
根据这两个数组可以求出不相交的对数,然后从总对数中减去即可。