哎呀,这题太神奇了
设计状态想爆脑袋都想不到什么好的,感觉怎么搞都O了个状态总数,转移就更别谈了
一看题解,恍然大悟
哎呀。。
首先对 ans=sigma(a[i]^2)进行转化,将其这样理解:用A和B分别表示一种取珠的方法,将结果相同的两种取珠方法(不管这两种取珠方法本身是否相同)记为(A, B),不难发现ans就是所有这样的(A, B)的对数。
设状态f(a1, b1, a2, b2),如果f(a1, b1, a2, b2) = K,表示存在K对不完全相同的(A, B),使得A方法已经取出了第一个串的前a1个字符及第二个串的前b1个字符,B方法已经取出了第一个串的前a2个字符以及第二个串的前b2个字符,同时A方法与B方法得到的结果相同。
显然,f(a1, b1, a2, b2)可以转移向4个方向:f(a1+1, b1, a2+1, b2),f(a1+1, b1, a2, b2+1),f(a1, b1+1, a2+1, b2),f(a1, b1+1, a2, b2+1),转移可行的前提是对应的字母相同。
最后,f(n, m, n, m)就是问题的答案。递推初态是f(0, 0, 0, 0) = 1.
恩,没错,就是这样,就这么简单,可是就是没想到啊
回过头想想,本题中唯一能用的承受得起的表示状态的东西就只有 操作序列
而怎么用跟操作序列有关的状态求出ans就成了本题关键,将乘法化为加法,对应到两种操作序列上,平方运算自然消除,而且恰好造出了神奇算法
代码:
囧,这题想了好久。。