小编ung*_*279的帖子

计算无向图中满足 W - L >= K 的节点对数量

问题:

给定一个由 N 个节点和 N-1 个边组成的无向图。所有边的长度均为 1。每条边i 的权重为Wi(0 <= Wi <= 10.000)

该图保证没有任何循环。因此,两个节点之间始终存在一条(也是唯一的)最短路径。

从图中取出一对节点 (u, v):

  • l是两个节点之间的最短路径的长度
  • w是 2 个节点之间的最短路径中权重最大的边

给定数字K ,计算图中满足w - l >= K的 (u, v) 对的数量

例子:

N = 3, K = 1
Edges:
1 - 2 - 3
1 - 3 - 2
Run Code Online (Sandbox Code Playgroud)

(边描述为:u - v - w)

答案:6。所有可能的对是: (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)

暴力解决方案(N < 100): …

algorithm graph-theory undirected-graph

9
推荐指数
1
解决办法
1018
查看次数

在 O(n.logn) 中至少出现两次的最长子串

问题:

给定一个包含 N 个字符的字符串 S (N <= 200 000),找出至少出现两次的最长子字符串的长度(子字符串可以重叠)。

我的解决方案:

这是我尝试过的:

int main()
{
    std::string s;
    std::cin >> s;
    int max = 0;
    typedef std::string::const_iterator sit;
    sit end = s.end();
    for(sit it1 = s.begin(); it1 != end; ++it1)
        for(sit it2 = it1 + 1; it2 != end; ++it2)
            max = std::max(max, std::mismatch(it1, it1 + (end - it2), it2).first - it1);
    std::cout << max;
}
Run Code Online (Sandbox Code Playgroud)

题:

但是,上述解决方案在 O(n^3) 中运行时将获得 TLE。有什么方法可以改进它以便它可以在 O(n.logn) 中运行?

c++ string algorithm substring longest-substring

7
推荐指数
1
解决办法
113
查看次数

删除第一个、第二个、最后一个或倒数第二个字符 K 次后的最小词典字符串

题:

给定一个字符串 SS.length() <= 5.10^5和一个整数 K K <= S.length()。对于每次移除,您可以:

  • 删除字符串的第一个字符
  • 删除字符串的第二个字符
  • 删除字符串的最后一个字符
  • 删除字符串的倒数第二个字符

我怎样才能准确地进行 K 次删除,以使最终字符串具有最小的字典顺序?

例子:

S = "abacaaba", K = 2

  • 删除字符串的第二个字符
  • 删除字符串的倒数第二个字符

最后一个字符串:“aacaaa”,这是可能的最小字典。

附:

我已经尝试了很多天,但无法找到解决此问题的有效方法。但我认为这与动态规划有关。

c++ algorithm dynamic-programming

6
推荐指数
1
解决办法
340
查看次数

对给定数组的 XOR 查询

给定一个包含 n 个整数的数组,索引从 1->n。任务是执行 Q 次给定的查询,并在每次查询后打印数组总和

我们可以执行三种类型的操作:

  • 1 X:将 X 添加到数组中(其索引将为 n+1、n+2、...)
  • 2 Y:从数组中删除索引为 Y 的元素
  • 3 Z:对数组中的每个元素i,执行i^Z(i xor Z)

例子:

输入arr[] = {2, 3, 9, 5, 6, 6}, Q = 5

1 3

3 5

2 2

3 2

2 7

输出: 34 37 31 27 23

说明

1 3 -> arr[] = {2, 3, 9, 5, 6, 6, 3} -> 总和 = 34

3 5 -> arr[] = {7, 6, …

algorithm xor bitwise-xor segment-tree

2
推荐指数
1
解决办法
45
查看次数