IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021CCPC网络赛1009题解 -> 正文阅读

[数据结构与算法]2021CCPC网络赛1009题解

题目

有一个机器人可以通过接收一系列命令来移动。
命令序列中有四种类型的命令:
机器人向上移动一个单位。
D:机器人向下移动一个单位。
L:机器人向左移动一个单位。
R:机器人向右移动一个单位。
现在,给定一个长度为n的命令序列。您需要找出命令序列中有多少子字符串满足以下条件:如果机器人执行子字符串命令,它可以返回到起始位置。
子字符串是字符串中连续的字符序列。例如,“best of”是“It was the best of times”的子字符串。例如,“Itwastimes”是“It was best of times”的子序列,但不是子字符串。


输入

此问题包含多个测试用例。
第一行包含一个整数t(1≤T≤20) 指示测试用例的数量。
对于每个测试用例,第一行包含一个整数n(2≤N≤105).
第二行包含长度为n的UDLR字符串。


输出

对于每个测试用例,输出一行一个整数表示答案。

输出案例

1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2

6

URLLDR

思路1

暴力枚举,算法复杂度O(n*2)

枚举每一个区间,记录x,y的值,区间的x和y最后等于0,满足条件,和加一。但是题目给的n<=1e5,使用暴力枚举肯定会超时。所以有没有更好的方法呢?答案肯定是有。

思路2

前缀和O(n)

前缀和是一种重要的预处理,能大大降低查询的时间复杂度。可以简单理解为“数列的前n项的和”。

前缀和可以求区间的和,比如[l,r]区间的和为sum[r]-sum[l-1];题目问的是如何某区间后还能回到原位,意思是寻找sum[l-1]==sum[r]的区间个数,这个区间的和为0。这个题目有两个元素,x和y,所以我们要进行维护x,y的值。所以我们需要用到pair<int,int>,并用map计数。用法为map<pair<x,y>,int>进行计数。那么计数完之后我们知道了每个pair<x,y>有多少个,那么我们怎么计算有多少个sum[l-1]==sum[r]这样的区间呢?一种算法是C_{n}^{2}\textrm{}。还有一种是累加,从0累加到n-1;

C++代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<pair<int, int>, ll> cnt;
char a[100010];
int main()
{
    int t;
    scanf("%d", &t);
    while (t --) {
        ll res = 0;
        cnt.clear();
        ll n;
        ll x = 0, y = 0;
        cnt[{0,0}] = 1;
        scanf("%d", &n);
        scanf("%s", a + 1);
        for (int i = 1;i <= n;i ++) {
            int id;
            if(a[i] == 'U') x++;
            else if(a[i] == 'L') y++;
            else if(a[i] == 'D') x--;
            else if(a[i] == 'R') y--;
            res += cnt[{x,y}];
            cnt[{x,y}] ++;
        }
        cout << res << endl;
    }
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:27:46  更:2021-08-30 12:28:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:35:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码