题目:
定义一个矩阵的贡献为:其互不相同的行的种类数。
给出一个矩阵,求其所有子矩阵的贡献和。
分析:
可以把每一行拿出来,弄成一个字符串,建一颗Trie树出来。
此时,就可以算出以最左端为左边界的所有子矩阵的贡献。
算完后,把第一层节点合并,相当于去除了第一列的所有数。
此时就可以看做把每一行从第二列开始,建的Trie树。
然后可以算出从第一列到第二列所有矩形贡献的变化量。(变化量只和合并的位置有关,所以计算一次变化量后,就会删去等量的点)
然后就可以算出以第二列为左边界的所有子矩阵的贡献。
……
就可以算出所有贡献了。
整个复杂度
O ( n m ( l o g n ) ( l o g m ) ) O(nm(logn)(logm)) O(nm(logn)(logm))
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#define SF scanf
#define PF printf
#define MAXN 500010
using namespace std;
typedef long long ll;
int n,m;
ll now;
void Read(int &x){
x=0;
char c;
while(c=getchar(),c!=EOF&&(c<'0'||c>