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[];
LL sum[+];
char str[+]; map< pair<char,LL>,int > ms;
map< pair<char,LL>,int > :: iterator it; void solve()
{
for(int i=;i<;i++){
scanf("%d",&val[i]);
}
scanf("%s",str);
int len = strlen(str); ms.clear();
LL res = ;
sum[] = ; for(int i=;i<=len;i++){
sum[i] = sum[i-] + val[str[i-] - 'a'];
} pair<char,LL> pr;
LL tmp;
for(int i=;i<=len;i++){
pr = make_pair(str[i-],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 ;
}
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),求 ...
- cf519D. A and B and Interesting Substrings(前缀和)
题意 给出$26$个字母对应的权值和一个字符串 问满足以下条件的子串有多少 首尾字母相同 中间字母权值相加为0 Sol 我们要找到区间满足$sum[i] - sum[j] = 0$ $sum[i] = ...
- Codeforces Round #294 (Div. 2)D - A and B and Interesting Substrings 字符串
D. A and B and Interesting Substrings time limit per test 2 seconds memory limit per test 256 megaby ...
- CF519 ABCD D. A and B and Interesting Substrings(map,好题)
A:http://codeforces.com/problemset/problem/519/A 水题没什么好说的. #include <iostream> #include <st ...
- Codeforces Round #294 (Div. 2) D. A and B and Interesting Substrings [dp 前缀和 ]
传送门 D. A and B and Interesting Substrings time limit per test 2 seconds memory limit per test 256 me ...
- Erlang 的新数据结构 map 浅析
更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ...
- ES6——数据结构 Map
数据结构 Map 字典: 用来存储不重复key的 Hash结构.不同于集合(Set)的是,字典使用的是 [键,值] 的形式来存储数据的. JavaScript 的对应那个(Object:{}) 只能用 ...
- ES6__数据结构 Map
/* 数据结构 Map */ /* * 字典:是用来存储不重复的key的hash结构.不同于集合(Set)的是,字典使用的是[键,值]的形式来储存数据的. *javaScript 的对象(Object ...
- 重学ES系列之新型数据结构Map应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- HDU-5536 Chip Factory (字典树)
题目大意:给n个数,编号为1~n,取三个编号不同的数,使表达式(a+b)^c的值最大. 题目分析:将这n个数按二进制位建立一棵trie.枚举i.j的和,查询亦或最大值,但在查询之前要把i.j在trie ...
- HDU-1011 Starship Troopers (树形DP+分组背包)
题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...
- 牧场安排(usaco NOV06.cowfood)
ohn新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧场上的某几格土地里种上美味的草,供他的奶 ...
- JSON的转换(将JSON转换为字符串,将字符串转化为JSON)
eval()和JSON.stringify() 1.eval用于从一个字符串中解析出json 对象,创建包含 JSON 语法的 JavaScript 字符串.例如 var str = '{ &qu ...
- MiniCRT 64位 linux 系统移植记录:64位gcc的几点注意
32位未修改源码与修改版的代码下载: git clone git@github.com:youzhonghui/MiniCRT.git MiniCRT 64位 linux 系统移植记录 MiniCRT ...
- Avoiding PostgreSQL database corruption
TL;DR: Don't ever set fsync=off, don't kill -9 the postmaster then deletepostmaster.pid, don't run P ...
- Android如何防止apk程序被反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-s ...
- php 错误 Strict Standards: PHP Strict Standards: Declaration of .... should be compatible with that of 解决办法
错误原因:这是由于 php 5.3版本后.要求继承类必须在父类之后定义.否则就会出现Strict Standards: PHP Strict Standards: Declaration of ... ...
- Oracle字符集与客户端
http://www.linuxidc.com/Linux/2011-11/47383p2.htm 什么是Oracle字符集Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关 ...
- Android测试环境搭建(win7)
一.安装JDK并配置环境变量 1.在Java官方网站上下载相应系统的jdk文件安装,如win7 64 位系统下安装jdk-6u45-windows-x64,全部选择默认的安装路径即可安装完成. 2.配 ...