对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
Find the longest common subarray with the same element in range l to r for multiple queries
给定一个数组,我们需要找到最长的连续子数组,该子数组在范围 l 到 r 中具有相同的元素以进行多个查询。例如,ar[] = {1,2,2,2,4,3,1,1,3}。
查询 1:l=1,r=5,元素=2,输出将为 3
查询 2:l=1,r=5,元素=1,输出将为 1
查询 3:l=6,r=9,元素=3,输出将为 1
查询 4:l=6,r=9,元素=1,输出为 2
我可以运行从 l 到 r 的循环,并计算给定元素在该范围内最长的连续出现,但我需要更好的方法。 约束为 1<=l,r,no。查询数,数组大小<=100000 这是我的蛮力代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
int main()
{
ll i,j,k,m,n,l,r,x;
n=9;
ll ar[n]={1,2,2,2,4,3,1,1,3};
ll query=4;//number of queries
while(query--)
{
cin>>l>>r>>x;
l--;r--;//changing to 0-based indexing
ll ctr=0;
ll ans=0;
for(i=l;i<=r;i++)
{
if(ar[i]==x)
{
ctr++;
}
else ctr=0;
ans=max(ctr,ans);
}
cout<<ans<<endl;
}
}
这个问题可以用段树来解决。
这是我的想法(未经测试(。
struct Node {
// Length of this segment.
int len;
// Value and length of the longest prefix subarray.
int prefix_val;
int prefix_len;
// Value and length of the longest suffix subarray.
int suffix_val;
int suffix_len;
// Value and length of the longest subarray in this segment.
int best_len;
int best_val;
};
// Combines two nodes.
Node combine(Node lhs, Node rhs) {
Node res;
res.len = lhs.len + rhs.len;
// Compute new best prefix subarray.
res.prefix_val = lhs.prefix_val;
res.prefix_len = lhs.prefix_len;
if (lhs.prefix_len == lhs.len &&
lhs.prefix_val == rhs.prefix_val) {
res.prefix_len = lhs.len + rhs.prefix_len;
}
// Compute new best suffix subarray.
res.suffix_val = rhs.suffix_val;
res.suffix_len = rhs.suffix_len;
if (rhs.suffix_len == rhs.len &&
rhs.suffix_val == lhs.suffix_val) {
res.suffix_len = rhs.len + lhs.suffix_len;
}
res.best_val = lhs.best_val;
res.best_len = lhs.best_len;
if (res.best_len < rhs.best_len) {
res.best_val = rhs.best_val;
res.best_len = rhs.best_len;
}
if (res.best_len < res.prefix_len) {
res.best_val = res.prefix_val;
res.best_len = res.prefix_len;
}
if (res.best_len < res.suffix_len) {
res.best_val = res.suffix_val;
res.best_len = res.suffix_len;
}
// Middle subarray.
if (lhs.suffix_val == rhs.prefix_val) {
int len = lhs.suffix_len + rhs.prefix_len;
if (res.best_len < len) {
res.best_val = val;
res.best_len = len;
}
}
return res;
}
每个查询的复杂性为 O(logN(。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀