首页 > 其他分享 >Solution Set - 咋提玄坛 | 说无可说

Solution Set - 咋提玄坛 | 说无可说

时间:2024-02-15 21:23:45浏览次数:19  
标签:Set 提玄坛 fa int Solution dfs dep length step

说无可说。

I have nothing to say.

Mi havas nenion por diri.

J'ai rien à dire.

说无可说

Link

我说,我去,暴力 dp 一次就是 \(O(|S| ^ 2)\) 的了,直接起飞!

题目说,我只要求相似度为 \(1 \sim 8\) 的字符串对数,there must be a reason。

我说,来可以 dfs,太奇啦!但是这要怎么搜啊?那么其实类似 dp 那么记录端点,,每次 dfs 转移下一个状态就是先暴力匹配,找到第一个依次推下去不相等的字符,从这里开始按照 dp 那样转移即可,具体可见代码。为了提升效率加一条最优性剪枝,因为当前答案一定不小于目前搜索的答案加上需要处理的字符串的长度之差(用加减字符达成同样长度)。

我说,有一个小细节,string 的长度是 unsigned 类型的,如果减的话可能会爆炸,要强转 int。

namespace liuzimingc {
const int N = 205;
#define endl '\n'

int n, i, j, res, ans[10];
string s[N];

void dfs(int x, int y, int step) {
	if (step >= res) return;
	while (x < s[i].length() && y < s[j].length() && s[i][x] == s[j][y]) x++, y++;
	if (x >= s[i].length() && y >= s[j].length()) {
		res = min(res, step);
		return;
	}
	if (x < s[i].length()) dfs(x + 1, y, step + 1);
	if (y < s[j].length()) dfs(x, y + 1, step + 1);
	if (x < s[i].length() && y < s[j].length()) dfs(x + 1, y + 1, step + 1);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> s[i];
	for (i = 1; i <= n; i++)
		for (j = i + 1; j <= n; j++) {
			res = 9;
			dfs(0, 0, 0);
			ans[res]++;
		}
	for (int i = 1; i <= 8; i++) cout << ans[i] << " \n"[i == 8];
	return 0;
}
#undef int
} // namespace liuzimingc

我说,这里算的是起点,dp 算的是一端的终点,本质相同。

我说,我不会傻逼爆搜。说无可说。

消防

首先,枢纽一定在树的直径上。

证明咕咕。

那么我们随便拉出来一条直径,那么所有点到路径的距离就分成两种情况:

  • 点在直径上。只能是路径的两个端点。可以用双指针 \(O(n)\) 维护长度和不大于 \(s\) 的路径(显然越大越好)
  • 点不在直径上。从直径上的点对其他点 dfs 一下就好了,每个点只会遍历一次所以是 \(O(n)\) 的。

然后综合两种情况就做完了!

namespace liuzimingc {
const int N = 3e5 + 5;
#define endl '\n'

int n, s, dep[N], x, fa[N], ans = 0x3f3f3f3f;
vector<pair<int, int>> e[N];
bool vis[N];

void dfs(int u, int f) {
	fa[u] = f;
	if (dep[u] > dep[x]) x = u;
	for (const auto &i : e[u]) {
		int v = i.first, w = i.second;
		if (v == f || vis[v]) continue;
		dep[v] = dep[u] + w;
		dfs(v, u);
	}
} // dep 得到从某一点开始到所有点的距离 

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> n >> s;
	for (int i = 1; i < n; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		e[u].push_back(make_pair(v, w));
		e[v].push_back(make_pair(u, w));
	}
	x = 1;
	dfs(1, 0);
	dep[x] = 0;
	dfs(x, 0); // 两次都找距离最远的点,求直径
	int begin = x; // 这条直径的最底端(抽象说法),fa[x] 就是跳上去
	for (int i = begin, j = begin; i; i = fa[i]) {
		while (dep[j] - dep[i] > s) j = fa[j];
		ans = min(ans, max(dep[i], dep[begin] - dep[j]));
	}
	for (int i = begin; i; i = fa[i]) vis[i] = true;
	for (int i = begin; i; i = fa[i]) {
		x = i;
		dep[i] = 0;
		dfs(i, fa[i]);
	}
	for (int i = 1; i <= n; i++) ans = max(ans, dep[i]);
	cout << ans << endl;
	return 0;
}
#undef int
} // namespace liuzimingc

以及顺便学到了两次 bfs / dfs 求直径,以前不知道。。。

小凸玩密室

龙门对决

咕咕。

标签:Set,提玄坛,fa,int,Solution,dfs,dep,length,step
From: https://www.cnblogs.com/liuzimingc/p/18016613/say

相关文章

  • python类的实现中有关__setattr__原理问题
    python类的实现中有关__settar__原理问题具体解决思路问题代码段:classCustomAttributes:def__init__(self):self._attributes={}def__setattr__(self,name,value):#允许设置名为'_attributes'的属性,这是实现所必......
  • 当创建statefulset资源后,k8s组件如何协作
    当创建statefulset资源后,k8s组件如何协作点击关注......
  • Solution Set【2024.2.15】
    A.枇杷树考虑从增量的角度计算答案,若我们在构造树\(T_n\)时已经得到了树\(T_x\)和树\(T_y\)的答案\(Ans_x\)和\(Ans_y\),我们考虑如何得出\(Ans_n\)。考虑\(Ans_n\)与\(Ans_x+Ans_y\),发现即为跨越新增的边的所有路径权值之和。其可以表达为:\[f(x,u)\timessi......
  • Python笔记09——Set(集合)
    九、集合9.1基础集合(set)是一个无序的不重复元素序列,可进行交、集、差等常见的集合操作。与序列的区别:无序,每次输出顺序随机;元素不重复;创建格式:parame={value01,value02,...}或者set(value)(创建空集合只能用set())创建集合示例set1={1,2,3,4}#直接使用......
  • CF103E Buying Sets(最大权闭合子图模型)
    题意简述有\(n\)个元素和\(n\)个集合,保证任意\(k\)个集合的并\(\gek\)。每个集合有权值\(a_i\),你需要选出一些集合使得集合数等于集合并大小,并在此基础上最小化选出的集合权值和。\(n\le300,|a_i|\le10^6\)。分析将集合和元素看成物品,我们发现,若选择了一个集合,则......
  • 在k8S中,DaemonSet类型的资源特性有哪些?
    Kubernetes(k8S)中的DaemonSet是一种控制器资源,它具有以下关键特性:每个节点运行一个实例:DaemonSet确保集群中的每个节点(满足特定条件的节点)上都运行一个Pod副本。这意味着无论何时创建或加入新的节点到集群中,DaemonSet都会自动为新节点调度和管理一个Pod。目标节点......
  • CF1735D Meta-set 题解
    题目大意给定\(n\)张卡牌,每张卡牌有\(k\)个属性,第\(i\)张卡牌的第\(j\)个属性为\(c_{i,j}\)。一个由\(3\)张卡牌\(x,y,z\)组成的集合被称作好的,当且仅当对于\(1\leqi\leqk\)均有\(c_{x,i}=c_{y,i}=c_{z,i}\)或者\(c_{x,i},c_{y,i},c_{z,i}\)两两不相等。......
  • 执行 set-ExecutionPolicy RemoteSigned 失败解决方法
    1、Window+r,输入powershell 2、输入命令行set-ExecutionPolicyRemoteSigned3、再输入命令行Set-ExecutionPolicy-ScopeCurrentUser4、验证一下是否成功了:输入get-ExecutionPolicy,系统回复Restricted,表示状态是禁止的;若是提示了RemoteSigned就代表成功。5、如......
  • 使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab
    错误详情:使用IDEA直接连接数据库报错:Serverreturnsinvalidtimezone.Goto'Advanced'tabandset'serverTimezone'propertymanually.错误原因:MySQL驱动中默认时区是UTC,与本地时间有时差。解决方案:点开最右侧导航栏Advanced,找到serverTimezone,在value处填写GMT保存再......
  • 面试经典:Java中list set map之间的区别
    前言大家好,我是chowley,最近正在复习Java集合,这次来总结一下list、set、map它们三个之间的区别。1.List(列表)定义:List是一种有序集合,允许存储重复元素,每个元素都有一个索引,可以按照插入顺序获取。特点:允许存储重复元素。有序集合,保留元素的插入顺序。可以通过索引访问元素。常见实现......