n,m = list(map(int,input().split())) matrix = [list(input()) for _ inrange(n)] res = 0 for i inrange(n-1): for j inrange(m-1): s = set() for x inrange(2): for y inrange(2): s.add(matrix[i+x][j+y]) iflen(s) == 4: res += 1 print(res)
# 读取 n-1 行输入,构建树的邻接表 for _ inrange(n - 1): u, v = list(map(int, input().split())) graph[u].append(v) graph[v].append(u)
# 定义一个大数 MOD,用于在计算过程中取模 MOD = 10 ** 9 + 7
# 定义 get_factors 函数,用于求一个数的所有质因子 defget_factors(n): prime_factors = [] # 将 n 除以 2,直到 n 为奇数 while n % 2 == 0: prime_factors.append(2) n //= 2 # 从 3 开始到 n 的平方根,每次增加 2(跳过偶数),检查每个数是否是 n 的质因子 for i inrange(3, int(n ** 0.5) + 1, 2): while n % i == 0: prime_factors.append(i) n //= i # 如果 n 大于 2,说明 n 是质数,将其加入质因子列表 if n > 2: prime_factors.append(n) return prime_factors
# 定义 dfs 函数,用于深度优先搜索图中的节点,并计算质因子的个数 defdfs(u, f, factors): vst[u] = True# 标记节点 u 为已访问 primes = get_factors(u) # 获取节点 u 的质因子 for p in primes: # 对每个质因子进行计数 factors[p] += 1 for v in graph[u]: # 遍历节点 u 的所有邻居节点 if v == f or colors[v - 1] == 'W': # 如果是父亲节点或颜色为白色,则跳过 continue dfs(v, u, factors) # 对邻居节点进行深度优先搜索 return factors # 返回质因子计数
res = 0# 初始化结果变量 # 从 1 到 n 遍历每个节点 for i inrange(1, n + 1): if colors[i - 1] == 'R'andnot vst[i]: # 如果节点颜色为红色且未访问 factors = dfs(i, -1, defaultdict(int)) # 从节点 i 开始进行深度优先搜索,并计算质因子个数 ans = 1# 初始化答案变量 for p in factors: # 对每个质因子进行处理 ans = ans * (factors[p] + 1) % MOD # 更新答案 res = (res + ans) % MOD # 更新结果变量
# 初始化全局变量 # pre 数组,用于存储到达每个节点的路径上的异或和 # par 数组,用于存储重根路径上的父节点 # bit 数组,用于存储深度的二进制表示中每一位的值 # f 数组,用于存储重根路径上的祖先节点 # depth 数组,用于存储每个节点的深度 pre = [0] * N par = [0] * N bit = [0] * 30 f = [[0] * 30for _ inrange(N)] depth = [0] * N
# 定义 dfs 函数,用于深度优先搜索,计算每个节点的深度和重根路径上的祖先节点 defdfs(u, parent): depth[u] = depth[parent] + 1 f[u][0] = parent i = 1 # 利用二进制提升,计算更高层次的祖先节点 while i < 30and bit[i] <= depth[u]: f[u][i] = f[f[u][i - 1]][i - 1] i += 1 # 遍历节点 u 的所有邻居节点 for v, w in G[u]: if v != parent: dfs(v, u)
# 定义 lca 函数,用于计算两个节点的最近公共祖先 deflca(x, y): # 确保 x 的深度小于等于 y 的深度 if depth[x] < depth[y]: x, y = y, x # 从高层次到低层次,检查两个节点的祖先节点是否相同 for i inrange(29, -1, -1): if depth[x] - depth[y] >= bit[i]: x = f[x][i] # 如果 x 和 y 相等,则它们是同一个节点,返回 x if x == y: return x # 从高层次到低层次,将 x 和 y 同时上溯,直到它们的祖先节点不相同 for i inrange(29, -1, -1): if f[x][i] != f[y][i]: x = f[x][i] y = f[y][i] # 返回 x 和 y 的最近公共祖先 return f[x][0]
# 定义 dfs_xor 函数,用于计算到达每个节点的路径上的异或和 defdfs_xor(u, fa): par[u] = fa for v, w in G[u]: if v != fa: pre[v] = pre[u] ^ w dfs_xor(v, u)
# 从节点 1 开始进行深度优先搜索,计算深度和重根路径上的祖先节点 dfs(1, -1)
# 计算到达每个节点的路径上的异或和 dfs_xor(1, -1)
# 初始化并查集的 parent 数组,用于存储节点的父节点 parent = [i for i inrange(n + 1)]
# 定义 find 函数,用于查找节点 x 的根节点 deffind(x): if parent[x] != x: parent[x] = find(parent[x]) return parent[x]
# 定义 union 函数,用于合并两个节点的集合 defunion(x, y): x, y = find(x), find(y) if x == y: return parent[x] = y
# 初始化删除边的集合 del_edges del_edges = set() for op in ops: if op[0] == 1: del_edges.add(op[1])
# 逆向遍历边的列表 edges,将未被删除的边加入到并查集中 for i, edge inenumerate(edges): if i + 1notin del_edges: union(edge[0], edge[1])
# 逆向遍历操作列表 ops,处理每个操作 ops.reverse() ans = [] for op in ops: if op[0] == 1: # 如果是删除边的操作,将对应的边加入到并查集中 u, v, w = edges[op[1] - 1] union(u, v) else: # 如果是查询操作,计算并返回两个节点的异或和 u, v = op[1], op[2] if find(u) != find(v): ans.append(-1) else: p = lca(u, v) c = par[p] ans.append(pre[u] ^ pre[p] ^ pre[v] ^ pre[c])