其他分享
首页 > 其他分享> > 杂题

杂题

作者:互联网

题意

定义字符集为\(\{a,b,c\}\)的合法字符串
空串合法
若\(S\)合法,\(aSa\),\(bSb\),\(cSc\)均合法
若\(S,T\)合法,\(ST\)合法
否则不合法
给定一个字符串,求交换任意两位不同字符后合法的方案数
\(|S|\le 10^5\)

做法

一道带有浓烈atc味道的题~

定义:对于字符串\(T\),令\(f(T)\)为反复将任意相邻且字符相同的两位删除,最后得到的串

结论1:一个字符串合法,充要条件为:\(f(T)\)为空串

结论2:对于字符串\(T_1,T_2\),若\(T_1+T_2\)合法(即\(f(T_1+T_2)\)为空串),充要条件为:\(f(T_1)=reverse(f(T_2))\)

现在,先来短暂探究一下\(f(T)\)的性质
考虑添加操作:显然可以用栈实现
考虑删除操作:若我们得到了\(S_{[1,i]}\)的栈,若要求\(S_{[1,i-1]}\)的栈。判断栈顶是否为\(S_i\),若为则弹出,否则加入。容易证明这是正确的
这两个操作都是\(O(1)\)的

考虑分治,对\([1,mid]\),\((mid,r]\)分别选择一个位置判断是否合法,可以\(O(1)\)的枚举要交换的字符,然后在哈希表中查询

标签:字符,mid,合法,充要条件,字符串,杂题,空串
来源: https://www.cnblogs.com/Grice/p/13787771.html