CF Round#17

来源:互联网 发布:基于栈的列表 java 编辑:程序博客网 时间:2024/05/17 08:45

这套题是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。

根据这两个数组可以求出不相交的对数,然后从总对数中减去即可。