D. A and B and Interesting Substrings(前缀和+思维)


题目大意:
先输入26个字符[‘a’,‘z’]的权值,然后给你一个字符串,问你满足以下条件的子串有多少个。
1:第一个和最后一个字符相等的子串。
2:在这个子串中除掉第一个和最后一个字符的权值,剩下的字符权值之和等于0。
思路:求一段区间和我们可以用前缀和O(1)解决,但是要在一个串中找所有首位字符相等的子串的时间复杂度是O(n^2),因为N=1e5,这个时间复杂度肯定超时,所有我们要从别的角度解决这个问题。
前缀和等于0意味着:sum[r - 1] - sum[ l ] = 0(减掉第一个和最后一个字符的权值),只要稍微移一下项,就可以降维了。即sum[r - 1] = sum[ l ]。也就是说如果前缀和数组中,如果他们的前缀和的值相等,并且首尾字符相等,意味着他们满足条件。我们可以用一个map维护这个前缀和。mp [ i ] [ j ] [ k ] 表示字符’i’的前缀和为j的数量是k。
这样O(n)扫一遍字符就可以解决问题了,不过由于要删掉首尾字符的权值,即考虑当前字符的权值应该是不包括自己的权值。
代码:

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
typedef long long int ll;
ll a[50],pre_s[maxn];
char s[maxn];
int main(){
	for(int i = 1; i <= 26; i++){
		cin>>a[i];
	}
	scanf("%s",s+1);
	int len = strlen(s + 1);
	for(int i = 1 ; i <= len; i++){
		pre_s[i] = pre_s[i-1] + a[s[i]-'a'+1];  
	}
	map<int,map<ll,ll> >mp;
	ll sum = 0,ans = 0;
	for(int i = 1; i <= len; i++){
		ans += mp[s[i] - 'a' + 1][sum];//先求答案后加当前的和
		sum += a[s[i] - 'a' +1];//前缀和
		mp[s[i] - 'a' + 1][sum]++;//计数
	}
	cout<<ans<<endl;
}

心得:map是个好东西,要活用。

全部评论

相关推荐

零零幺零零幺:至少再做一个项目,然后猛投小厂,不然有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24847次浏览 491人参与
# 中国电信笔试 #
31080次浏览 283人参与
# 厦门银行科技岗值不值得投 #
7490次浏览 186人参与
# 你的实习产出是真实的还是包装的? #
18792次浏览 330人参与
# 如果秋招能重来,我会____ #
96691次浏览 500人参与
# 春招至今,你的战绩如何? #
59910次浏览 543人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14141次浏览 209人参与
# i人适合做什么工作 #
36914次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79511次浏览 219人参与
# 哪些公司真双非友好? #
69200次浏览 287人参与
# 金三银四,你的春招进行到哪个阶段了? #
21567次浏览 277人参与
# 找AI工作可以去哪些公司? #
7673次浏览 186人参与
# 从事AI岗需要掌握哪些技术栈? #
7676次浏览 251人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339915次浏览 2165人参与
# 面试尴尬现场 #
220755次浏览 861人参与
# 五一之后,实习真的很难找吗? #
102797次浏览 584人参与
# 你做过最难的笔试是哪家公司 #
30108次浏览 193人参与
# 你小时候最想从事什么职业 #
159840次浏览 2072人参与
# 应届生第一份工资要多少合适 #
20483次浏览 84人参与
# 阿里笔试 #
176460次浏览 1302人参与
# 一张图晒出你司的标语 #
3821次浏览 72人参与
# 面试被问期望薪资时该如何回答 #
382459次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务