杂题
作者:互联网
题意
定义字符集为\(\{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