首页 > 其他分享 >Solution - Hossam and (sub-)palindromic tree

Solution - Hossam and (sub-)palindromic tree

时间:2023-11-16 16:34:52浏览次数:37  
标签:rt sub palindromic int tree back len dfs push

又名:《最近 vjudge 题全部罚坐》。

唯一 Trick:回文序列,就想区间 dp!时间复杂度 \(O(n ^ 2)\)!

如果是序列:\(f_{l, r}\) 表示 \([l, r]\) 的最长回文子序列,\(f_{l, r} = \max(f_{l + 1, r}, f_{l, r - 1}, f_{l + 1, r - 1} + [s_l = s_r])\),\(s\) 是字符串。很 trivial。

但是这是在树上!怎么知道 \(u\) 往 \(v\) 走一步之后的点是什么?

  1. 类似于 lca 一样跳(?),我猜的。
  2. 其实只需要每个点 dfs 一次预处理,总共 \(O(n ^ 2)\) 就行了。还可以顺便处理出两点之间的距离(相当于序列上的 \(len = r - l + 1\)),所以有时候大道至简(?)。
namespace liuzimingc {
const int N = 2e3 + 5;
#define endl '\n'
 
int T, n, f[N][N], go[N][N];
char s[N];
vector<int> e[N];
vector<pair<int, int>> sta[N];
 
void dfs(int rt, int g, int u, int fa, int len) {
	go[rt][u] = g;
	sta[len].push_back(make_pair(rt, u));
	for (const int &v : e[u]) {
		if (v == fa) continue;
		dfs(rt, !len ? v : g, v, u, len + 1);
	}
}
 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> T;
	while (T--) {
		cin >> n >> (s + 1);
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				f[i][j] = go[i][j] = 0;
		for (int i = 1; i <= n; i++) sta[i].clear(), e[i].clear(), f[i][i] = 1;
		for (int i = 1; i < n; i++) {
			int u, v;
			cin >> u >> v;
			e[u].push_back(v);
			e[v].push_back(u);
			f[u][v] = f[v][u] = 1 + (s[u] == s[v]);
		}
		for (int i = 1; i <= n; i++) dfs(i, i, i, i, 0);
		for (int len = 2; len <= n; len++)
			for (const auto &i : sta[len]) {
				int l = i.first, r = i.second;
				f[l][r] = max({ f[go[l][r]][r], f[l][go[r][l]], f[go[l][r]][go[r][l]] + (s[l] == s[r] ? 2 : 0) });
			}
		int ans = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				ans = max(ans, f[i][j]);
		cout << ans << endl;
	}
	return 0;
}
} // namespace liuzimingc

标签:rt,sub,palindromic,int,tree,back,len,dfs,push
From: https://www.cnblogs.com/liuzimingc/p/hossam.html

相关文章

  • antd的tree的核心显示属性
     树形组件的概念 ......
  • 【刷题笔记】110. Balanced Binary Tree
    题目Givenabinarytree,determineifitisheight-balanced.Forthisproblem,aheight-balancedbinarytreeisdefinedas:abinarytreeinwhichthedepthofthetwosubtreesofeverynodeneverdifferbymorethan1.Example1:Giventhefollowingtree......
  • CF570D Tree Requests
    题意给定一棵根为\(1\)的有根树,以及字符串\(S\)。\(x,h\)求\(x\)的子树内,深度为\(h\)的节点的字符能否重排为一个回文串。Sol不难发现,回文串显然至多有一个字符出现奇数个。所以我们对于每种字符随机附权值,维护前缀异或值。查询时枚举\(26\)种为奇数的情况,这是......
  • subject organization is not system:nodes 问题解决
    在下面的issues找到了答案:https://github.com/kubernetes/kubernetes/issues/99504┌──[[email protected]]-[~]└─$kubectlgetcsrNAMEAGESIGNERNAMEREQUESTORREQU......
  • python tkinter treeview 仿 excel表格
    代码:fromtkinterimportttkfromtkinterimport*root=Tk()#初始框的声明columns=("姓名","IP地址")treeview=ttk.Treeview(root,height=18,show="headings",columns=columns)#表格treeview.column("姓名",width=100,a......
  • 决策树(Decision Tree)
    决策树是一种基于树结构的分类和回归模型,它通过对数据进行逐步的分解,从根节点开始,根据不同的特征进行分割,最终到达叶节点,叶节点对应一个预测结果。以下是决策树的基本概念和构建过程的详细解释:决策树的基本概念:节点(Node):根节点(RootNode):树的起始节点,包含整个数据集。内部节......
  • TreeSet
      ......
  • AT_tdpc_tree 木
    题目描述:给定一棵大小为\(n\)的树,用另外\(n\)个点加边构造出这棵树,要求构造时所被边连到的点联通,求有多少连边顺序。数据范围:\(1\leqn\leq1000\)。思路:首先我们发现,因为题目要求连边后一定是一个连通块,所以考虑以哪一个点作为起点,然后向下连边。所以我们得到一个初......
  • element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选
    element-uitree异步树实现勾选自动展开、指定展开、指定勾选 背景项目中用到了vue的element-ui框架,用到了el-tree组件。由于数据量很大,使用了数据懒加载模式,即异步树。异步树采用复选框进行结点选择的时候,没法自动展开,官方文档找了半天也没有找到好的办法!找不到相关的配......
  • D. Score of a Tree
    D.ScoreofaTreeYouaregivenatreeof$n$nodes,rootedat$1$.Everynodehasavalueofeither$0$or$1$attime$t=0$.Atanyintegertime$t>0$,thevalueofanodebecomesthebitwiseXORofthevaluesofitschildrenattime$t-1$;theva......