字典树,AcWing 5726. 连续子序列

2024-06-01 22:04
文章标签 序列 连续 acwing 字典 5726

本文主要是介绍字典树,AcWing 5726. 连续子序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

5726. 连续子序列 - AcWing题库


二、解题报告

1、思路分析

字典树存储前缀和

考虑边遍历计算前缀和,边查询字典树

查询流程:

记当前前缀和为s

如果当前位k为1,那么s 必须 走当前位和自己不同的结点

如果当前位k为0,那么我们加上当前位和s不同的结点记录的前缀数目,然后走当前位和s相同的结点


卡常有点难受x_x,动态开3e7跑出来6000ms+会卡掉,静态开3e7是3800ms

2、复杂度

时间复杂度: O(nlogn)空间复杂度:O(30N),试出来的

3、代码详解

#include <bits/stdc++.h>using namespace std;typedef long long LL;constexpr int N = 1000010, M = 3e7 + 10;int n, k;
int a[N], s[N];
int tr[M][2], idx;
int cnt[M];void insert(int x)
{int p = 0;for (int i = 29; i >= 0; i -- ){int u = x >> i & 1;if (!tr[p][u]) tr[p][u] = ++ idx;p = tr[p][u];cnt[p] ++ ;}
}int query(int x)
{int res = 0, p = 0;for (int i = 29; i >= 0; i -- ){int u = x >> i & 1, v = k >> i & 1;if (v == 0){res += cnt[tr[p][u ^ 1]];if (!tr[p][u]) return res;p = tr[p][u];}else{if (!tr[p][u ^ 1]) return res;p = tr[p][u ^ 1];}}res += cnt[p];return res;
}void solve()
{cin >> n >> k;for (int i = 1; i <= n; i ++ ) cin >> a[i];for (int i = 1; i <= n; i ++ )s[i] = s[i - 1] ^ a[i];insert(s[0]);LL res = 0;for (int i = 1; i <= n; i ++ ){res += query(s[i]);insert(s[i]);}cout << res << "\n";
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int T = 1;while (T -- ) solve();return 0;
}

这篇关于字典树,AcWing 5726. 连续子序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022229

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1