首页 > 其他分享 >贡献法解决子串问题

贡献法解决子串问题

时间:2024-01-30 13:34:52浏览次数:28  
标签:子串 tmp int 字母 贡献 mp 解决

对于一个字符串 \(S\),我们定义 \(S\) 的分值 \(f(S)\) 为 \(S\) 中恰好出现一次的字符个数。

例如 \(f (“aba”) = 1\),\(f (“abc”) = 3\), \(f (“aaa”) = 0\)。

现在给定一个字符串 \(S[0…n-1]\)(长度为 \(n\)),请你计算对于所有 \(S\) 的非空子串 \(S[i…j] (0 ≤ i \le j < n)\), \(f (S[i…j])\) 的和是多少。

贡献法:考虑当前这个字母可以在多少个子串中贡献,找到左边最近的相同字母,右边最近的相同字母,左右乘法原理计算可贡献子串数

  • 会爆longlong,并且只开ans不够

实现: 用哈希表正序逆序扫一遍,注意对于左右边界的处理时假设0和n+1存在相同字母

// Problem: 子串分值
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/2871/
// Memory Limit: 64 MB
// Time Limit: 1000 ms

int a[N];
int l[N],r[N];
map<char,int>mp;
void solve(){
	string s;cin>>s;ll ans=0;
	int len=s.size();
	string tmp=" ";
	tmp+=s;
	for(int i=1;i<=len;i++){
		if(mp[tmp[i]]){
			l[i]=mp[tmp[i]];
			mp[tmp[i]]=i;
		}
		else {
			l[i]=0;
			mp[tmp[i]]=i;
		}
	}
	mp.clear();
	for(int i=len;i>=1;i--){
		if(mp[tmp[i]]){
			r[i]=mp[tmp[i]];
			mp[tmp[i]]=i;
		}
		else {
			r[i]=len+1;;
			mp[tmp[i]]=i;
		}
	}
	for(int i=1;i<=len;i++){
		ans+=(i-l[i])*(r[i]-i);
	}
	cout<<ans<<endl;
}

标签:子串,tmp,int,字母,贡献,mp,解决
From: https://www.cnblogs.com/mathiter/p/17996908

相关文章

  • Springboot开发者的福音!免费好用的一站式IDE解决方案来了!SpringToolSuite4登场!
    SpringToolSuite4介绍最近由于工作原因,需要自己编写springboot应用(不是特别复杂),代码量不是很大,但是在选择IDE上却浪费了我很多时间!如果大家跟我一样,在开发springboot应用的过程中遇到如下两个问题:苦于Idea的版权问题讨厌在VisualStudio中安装各种令人头疼的插件那么我们不妨试一下......
  • RocketMQ应用-消费幂等性问题解决
    重复消费产生原因生产者多次投递-投递时服务端接收后客户端网络原因确认失败,重新投递消费者扩容重试-消费者扩容导致正在消费的消息没有正常应答,服务端重新推送重复消费解决方案给消息增加唯一key,消费时校验key是否已经消费过消费者控制消息的幂等性(多次同样的操作结果一......
  • 一次因PageHelper引起的多线程复用问题的排查和解决 | 京东物流技术团队
    A、ProblemDescription1\.PageHelper方法使用了静态的ThreadLocal参数,在startPage()调用紧跟MyBatis查询方法后,才会自动清除ThreadLocal存储的对象。2\.当一个线程先执行了A方法的PageHelper.startPage(intpageNum,intpageSize)后,在未执行到SQL语句前,因为代码抛异常而提前结束......
  • 一次因PageHelper引起的多线程复用问题的排查和解决 | 京东物流技术团队
    A、ProblemDescription1.PageHelper方法使用了静态的ThreadLocal参数,在startPage()调用紧跟MyBatis查询方法后,才会自动清除ThreadLocal存储的对象。2.当一个线程先执行了A方法的PageHelper.startPage(intpageNum,intpageSize)后,在未执行到SQL语句前,因为代码抛异常而提前结束......
  • 最全的项目部署+持续集成解决方案:Jenkins + git + docker
    最全的项目部署+持续集成解决方案:Jenkins+git+docker:https://blog.csdn.net/m0_45806184/article/details/126408527?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-126408527-blog-128137274.235^v43^control&spm=1001.21......
  • win11家庭版没有本地用户和组怎么办 win11家庭版没有本地用户和组解决方法
    https://www.xtzjcz.com/pc/247809.htmlwin11家庭版没有本地用户和组怎么办呢,当用户发现自己的win11的系统是家庭版本的时候并且没有本地用户和组的开启功能的话要怎么操作才能拥有呢,其实这个功能在win11上是有的只不过一般家庭版不让用,下面就是关于win11家庭版没有本地用户和组......
  • [转]解决Visual Studio 调试时加载符号慢的问题 - zhaotianff - 博客园
    什么是调试符号编译程序时生成的一组特殊字符,并包含有关变量和函数在生成的二进制文件中的位置以及其他服务信息的信息。该数据集可用于逐步调试程序或检查第三方代码。调试符号可以添加到可执行文件或库中,但是大多数现代编译器将它们存储为单独的对象。例如,VisualStudio将调......
  • Docker的错误和解决
    错误一dockerbuild"requiresexactly1argument.See'dockerbuild--help'. Usage: dockerbuild[OPTIONS]PATH|URL|- BuildanimagefromaDockerfile 解决  dockerbuild-torder.  (结尾有一个点)  错误二Gotpermissiondeniedwhile......
  • SparkSQL无法创建多个Session解决方法
    一、问题现象SparkSQL创建多个session报错,不能创建一个链接,链接Spark自带的数据库derby2024-01-2519:50:59.053[INFO]24/01/2519:50:59INFO!PLExecution!:ExecuteSQL:DROPTABLEIFEXISTSibor_nfsd_instjmport2024-01-2519:51:01.628(INFO]24/01/2519:51:01IN......
  • 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构
    英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑近期,AIGC领域呈现出一片繁荣景象,其背后离不开强大算力的支持。以ChatGPT为例,其高效的运行依赖于一台由微软投资建造的超级计算机。这台超级计算机配备了数万个NVIDIA......