题目链接:problem
考虑逆序对的贡献是怎样产生的。
分析后可发现,逆序对产生的方式有两种:
- 两个字符串的前\(i-1\)个字符相同,第\(i\)个字符不同
- 一个字符串是另一个字符串的前缀
设\(f[x][y]\)表示在给定的字符串序列中,\((str1,str2)\)对的数量,其中\((str1,str2)\)满足:
- \(str1\) 在 \(str2\) 之前
- 存在一个位置 \(i\) ,使得\(str1[1到i-1]==str2[1到i-1]\)
- \(str1[i]==x\),\(str2[i]==y\)。\(x,y\)表示字符。
则 $ans1 = $
\[ \sum_{seq[x]>seq[y]}f[x][y]
\]
其中\(seq[x]\)为字符\(x\)在当前给定的字母表中的位置。
计算\(ans2\):在插入某个字符串\(str\)前,用这个字符串跑一遍字典树,若可到\(str\)的末尾,则看其末尾之后的前缀数量,这些字符串都可以使得\(str\)是它们的真前缀,自然和\(str\)构成逆序对。对于每个字符串,在插入前做这样的统计即可。注意走不到末尾时不能作统计,具体实现见代码。
code