首页 > 其他分享 >codeforces刷题(1100):1917B_div2

codeforces刷题(1100):1917B_div2

时间:2023-12-26 16:35:55浏览次数:47  
标签:字符 前缀 删除 int 1917B codeforces 字符串 操作 div2

模板

B、Erase First or Second Letter

跳转原题点击此:该题地址

1、题目大意

  给你一个字符串,可以执行任意次以下操作,生成最终的字符串(不可为空),问你能生成的不重复字符串数为多少。

  1. 操作一:删除字符串第一个字符;
  2. 操作二:删除字符串第二个字符。

2、题目解析

  发现,操作一:即选定任意一个字符的后缀字符串;操作二:选定任意一个字符,和后面相隔一个字符的后缀字符串。
  例如案例4:bcdaaaabcdaaaa,其答案为50:
  具体操作如下:
  1、删除第\(-1\)位置(即保留第一个字符b)的字符,然后通过操作二不断删除后面的字符:bdaaaabcdaaaa、baaaabcdaaaa、baaabcdaaaa、\(\cdots\)、b,这样加上本身就有14种不同的方案(长度不同肯定不一样);
  2、然后删除第0位置的字符(即第一个字符b),就通过操作二不断删除后面的字符:caaaabcdaaaa、caaabcdaaaa、\(\cdots\)、c,加上本身(caaaabcdaaaa)一共13种。
  之后发现一直到第四次结束答案就已经为50了,说明后面的操作是重复的了。原理在于:如第五次的aaabcdaaaa,就能通过第四次的aaaabcdaaaa来完全实现。
  也就是说在这种思想下:只要前缀相等,那就能通过不断地操作一来实现。所以只要前缀字符不相等,那么该前缀字符+其后缀的长度的就是不重复的方案数。

#include<bits/stdc++.h>

using namespace std;

int t;
int n;
string s;

void solve()
{
	cin >> n >> s;
	
	set<char> se;
	int ans = 0;
	
	for(int i = 0; i < s.size(); i++)
	{
		if(!se.count(s[i]))	// 只要其前缀字符没有出现过
		{
			se.insert(s[i]);	// 那么加上其通过操作二得到的方案数即可
			ans += n - i;	// 因为i初始是0,并且其本身也是一种方案,所以n-i即可
		}	
	}
	cout << ans << endl;
}

int main()
{
	cin >> t;
	while (t--)
	{
		solve();
	}

	return 0;
}

 

标签:字符,前缀,删除,int,1917B,codeforces,字符串,操作,div2
From: https://www.cnblogs.com/Tom-catlll/p/17928416.html

相关文章

  • Codeforces 1909G - Pumping Lemma
    这个题思考角度很多,做法也很多。这里介绍一种@asmend和我讲的做法。设\(d=m-n\),那么我们枚举\(|x|=i,|y|=j\),设\(s,t\)的LCP长为\(l_1\),LCS长为\(l_2\),那么可以得到这组\((i,j)\)合法的充要条件是:\(i\lel_1\)\(m-i-j-d\lel_2\)。\(d\bmodj=0\)。\(t[i,i+d-1......
  • Codeforces1917F - Construct Tree
    Codeforces1917F-ConstructTreeProblems给一个长度为\(n\)的序列\(l\)和\(d\)。要求判断是否可以构造出一颗节点数为\(n+1\)的树,满足\(l\)的每一个元素唯一对应为一条边的长度,并使整棵树的直径长度恰好为\(d\)。Solution不妨令\(l_1\lel_2\le\cdots\lel_......
  • CodeForces 1906K Deck-Building Game
    洛谷传送门CF传送门UNR#2黎明前的巧克力。枚举两个人选的卡的并集\(S\),那么当\(\bigoplus\limits_{i\inS}a_i=0\)时\(S\)有贡献\(2^{|S|}\)。考虑将\(2^{|S|}\)分摊到每个元素上,也就是每个元素有\(2\)的贡献,然后把这些贡献乘起来。所以题目其实是想让我们算......
  • Codeforces1917E - Construct Matrix
    Codeforces1917E-ConstructMatrix首先考虑因为\(n\)为偶数,所以\(k\)为奇数时不可能满足条件。其次,如果\(4|k\),那么实际上在矩阵中一直放\(2\times2\)的全为\(1\)的矩阵就可以了。随后,如果\(k\equiv2\mod4\),那么可以证明如果\(k\ne2\landk\nen^2-2\),......
  • Codeforces Round 917 (Div. 2)
    基本情况A题秒了,B题卡了一年。B.EraseFirstorSecondLetterProblem-B-Codeforces卡题分析两方面原因没有变通,一开始的思路是公式算出总字串数再想办法找重复的减掉,但搞了一个小时都不可行,应该早点换成正着来找的思路。没有更深入的分析样例。最后虽然出来了,......
  • codeforces刷题(1100):1907C_div3
    C、RemovalofUnattractivePairs跳转原题点击此:该题地址1、题目大意  给定一个字符串,可以删除相邻的两个不相等的字符。问你删除后能得到最小的字符串长度为多少。2、题目解析  因为只要两个不相等的字符相邻就能消除,所以只需要找到数量最多的字符,只要它的数量比其它字......
  • CodeForces 1909E Multiple Lamps
    洛谷传送门CF传送门感觉这个题比较难蚌。发现按\(1\simn\)最后可以把\(1\simn\)中的所有平方数点亮。所以\(n\ge20\)就直接输出\(1\simn\)。考虑\(n\le19\)。猜测合法的方案(即按完后亮灯数\(\le\left\lfloor\frac{n}{5}\right\rfloor\)的方案,不考虑\((......
  • CodeForces 1909D Split Plus K
    洛谷传送门CF传送门设最后每个数都相等时为\(t\)。那么一次操作变成了合并两个数\(x,y\),再增加\(x+y-k\)。于是每个\(a_i\)可以被表示成\(b_it-(b_i-1)k\)的形式,化简得\(a_i-k=b_i(t-k)\)。因为\(t-k\)对于每个\(i\)都相同,又因为我们的目标是......
  • CodeForces 1909F2 Small Permutation Problem (Hard Version)
    洛谷传送门CF传送门感觉这个题还是挺不错的。考虑F1。考察\(a_i\)差分后的意义,发现\(a_i-a_{i-1}\)就是\((\sum\limits_{j=1}^{i-1}[p_j=i])+p_i\lei\)。考虑将其转化为棋盘问题。在\((i,p_i)\)放一个车,那么\(a_i-a_{i-1}\)就是\((1,i)\sim......
  • Codeforces 1900E Transitive Graph
    考虑题目的限制条件:存在$a\tob,b\toc$的边,就会有$a\toc$的边。考虑$p_{1\simk}$,满足这$k$个点按顺序组成了一个环且无重点。那么$p_1\top_2,p_2\top_3$,就有$p_1\top_3$,又有$p_3\top_4$,所以有$p_1\top_4$。以此类推,会发现$\foralli,j\in[1,k],i\not......