cf519D . A and B and Interesting Substrings 数据结构map

题意:

已知26个小写字母有各自的权值(正,负,或0)

现在给出一个字符串,长度<=1e5

问这个字符串有多少个子串满足:

开头的字母和结尾的字母一样

字符串除了开头和结尾的字母外,其余的字母的权值和为0

本来是一道水题,一看就知道大体的思路了,结果硬是搞了一个多小时

先是用set,发现超时了,改为用map

思路:

1.我们先预处理这个字符串的权值的前缀和

sum[i]表示从字符串的起点到i的权值和

2.我们要找到的子串,设以l开头和r结尾,则有

str[r] == str[l] 和 sum[r-1] - sum[l] == 0

即:sum[r] - sum[l] == val[str[r] - ‘a‘]

那么我们只要记录:

(char,sum)以0为开头,char为结尾,权值和为sum的子串的个数即可

实现:用一个map

遍历一遍字符串,对于每一个(char,sum),找到前面出现多少(char,sum-val[char-‘a‘])

然后更新res,并且map[(char,sum)]++

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <cstdlib>

#define LL long long
#define fir first
#define sec second

using namespace std;

int val[26];
LL sum[100000+5];
char str[100000+5];

map< pair<char,LL>,int > ms;
map< pair<char,LL>,int > :: iterator it;

void solve()
{
    for(int i=0;i<26;i++){
        scanf("%d",&val[i]);
    }
    scanf("%s",str);
    int len = strlen(str);

    ms.clear();
    LL res = 0;
    sum[0] = 0;

    for(int i=1;i<=len;i++){
        sum[i] = sum[i-1] + val[str[i-1] - ‘a‘];
    }

    pair<char,LL> pr;
    LL tmp;
    for(int i=1;i<=len;i++){
        pr = make_pair(str[i-1],sum[i]);
        it = ms.find(make_pair(pr.fir,pr.sec - val[pr.fir-‘a‘]));
        if(it != ms.end())
            res += it->sec;
        ms[pr]++;
    }

    //printf("%lld\n",res);
    printf("%I64d\n",res);
    return ;
}

int main()
{
    solve();
    return 0;
}
时间: 2025-01-31 06:56:05

cf519D . A and B and Interesting Substrings 数据结构map的相关文章

[CF Round #294 div2] D. A and B and Interesting Substrings 【Map】

题目链接:D. A and B and Interesting Substrings 题目大意 给定26个小写字母的权值,一共26个整数(有正有负). 给定一个小写字母组成的字符串(长度10^5),求有多少长度大于1的子串满足: 1)首尾字符相同. 2)除了首尾字符外,其他字符的权值和为0. 题目分析 使用STL Map.开26个Map,给每个字母开一个. 先求出权值的前缀和 Sum[] . 然后1到l枚举每一位字符,如果是a,那么 Ans += Map[a][Sum[i - 1]]; 然后 +

Java数据结构Map,List,Set及Queue相关的类图

闲来无事,把util包中相关的数据结构的类图及其关系画了一下,给大家分享一下. 总览图:  Map:  List and Set: Queue: Java数据结构Map,List,Set及Queue相关的类图

JAVA数据结构——Map之HashMap

JAVA数据结构--Map之HashMap 一.原型及简介 原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 简介:HashMap基于散列表实现的一个key-value数据结构,能够实现通过key值快速查找.HashMap继承自AbstractMap抽闲类,实现了Map接口. 二.数据结构原理介绍 如下图所示,HashMap

ES6——数据结构 Map

数据结构 Map 字典: 用来存储不重复key的 Hash结构.不同于集合(Set)的是,字典使用的是 [键,值] 的形式来存储数据的. JavaScript 的对应那个(Object:{}) 只能用字符串当做键.这给他的使用带来了很大的限制. var data1={a:"1"},data2={b:"2"},obj={}; obj[data1]=1; obj[data2]=2; console.log(obj); 1.创建一个 Map const map=new M

Codeforces Round #294 Div2 D(A and B and Interesting Substrings)

Problem 给一个长度为N的字符串S,字符集是[a,z],每个字符都有一个权值Vi,求有多少个子串subS满足以下条件: 1. |subS|>=2 2. subS[0]=subS[|subS|?1] 3. ∑|subS|?2i=1Vi=0 Limits TimeLimit(ms):2000 MemoryLimit(MB):256 N∈[1,105] Vi∈[?105,105] Look up Original Problem From here Solution 如果没有条件2,用前缀和思想

Java中常见数据结构Map之HashMap

之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/p/5808006.html HashMap和HashTable的区别: http://www.cnblogs.com/wang-meng/p/5720805.html 今天来讲HashMap是分JDK7和JDK8 对比着来讲的, 因为JDK8中针对于HashMap有些小的改动, 这也是一些面试会经

ES6新增数据结构Map的用法

Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成”[object Object]“. ES6提供了”值-值“对的数据结构,键名不仅可以是字符串,也可以是对象.它是一个更完善的Hash结构. 特性 1.键值对,键可以是对象. const map1 = new Map() const objkey = {p1: 'v1'} map1.set(objk

Java中常见数据结构Map之LinkedHashMap

前面已经说完了HashMap, 接着来说下LinkedHashMap. 看到Linked就知道它是有序的Map,即插入顺序和取出顺序是一致的, 究竟是怎样做到的呢? 下面就一窥源码吧. 1, LinkedHashMap基本结构 LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap. LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现提供所有可选的映射操作,并允许使用n

【GoLang笔记】实例分析GoLang built-in数据结构map的赋值引用行为

备注1:本文旨在介绍Go语言中map这个内置数据结构的引用行为,并用实例来说明如何避免这种引用行为带来的"副作用". 备注2:文末列出的参考资料均来自GoLang.org官方文档,需翻墙访问. 1. map internals map是go中内置的数据结构,关于其语法规则,可以查看language specification中这里的说明,或者查看Effective Go中关于Maps的说明,此处略过. map的底层是用hashmap实现的(底层hashmap源码路径为src/pkg/r