Erase First or Second Letter

文章介绍了在一场编程竞赛中的问题,通过删除首尾字符操作,分析如何通过字符计数得出不同字符串种类。主要涉及C++编程实现。
摘要由CSDN通过智能技术生成

Codeforces Round 917 (Div. 2)
B. Erase First or Second Letter
题目链接

题意:

给你n和长度为n的小写字母字符串s,可以进行两种操作:

  1. 删掉第一个字符
  2. 删掉第二个字符

问通过这两种操作最多可以获得多少种字符串

思路:

不难的好题

很容易想到删掉第二个字符再删第一个字符跟删两次第一次字符是一样的,所以操作可以简化成先删掉x次第一个字符,再删掉y个第二个字符,这样,中间会正好剩下一个字符,加上后面没有删掉字符就构成了一个新字符串。

如果通过不同的操作得到了相同的字符串,那么这两个字符串肯定最前面那个单个字符是一样的,而且后面的部分是一致的。我们通过这两种操作是删不到后面的字符,后面部分一致,只需要后面长度一致即可,为此前面删掉的字符个数就是一样多的,即x+y一样,后面部分就是一样的。

把一个字符串分成两部分,前i个字符选出一个字符,然后通过两种操作把它前后的字符都删掉,再接上后n-i个字符。既然i确定后,后面部分就确定相同了,那么我们考虑前面部分的那一个字符,只要最前面这个字符一致,两个字符串就是一致的,而问有几种不同的字符串,只要枚举前面部分的长度i,统计一下前面部分有几种字符就可以了。

code:

#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
using namespace std;
typedef long long ll;
 
int T,n;
string t;
set<char> s;
 
int main(){
	cin>>T;
	while(T--){
		cin>>n>>t;
		s.clear();
		ll ans=0;
		for(auto &x:t){
			if(!s.count(x))
				s.insert(x);
			ans+=s.size();
		}
		cout<<ans<<endl;
	}
	return 0;
}
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值