首页 > 其他分享 >Codeforces Round 917 (Div. 2)

Codeforces Round 917 (Div. 2)

时间:2023-12-25 10:37:05浏览次数:42  
标签:insert cin int Codeforces st 后缀 ans 917 Div

基本情况

A题秒了,B题卡了一年。

B. Erase First or Second Letter

Problem - B - Codeforces

卡题分析

两方面原因

  1. 没有变通,一开始的思路是公式算出总字串数再想办法找重复的减掉,但搞了一个小时都不可行,应该早点换成正着来找的思路。
  2. 没有更深入的分析样例。

最后虽然出来了,但是 +6,而且也不如正解。

oid solve()
{
	ll n, ans = 0;
	cin >> n;
	string s;
	cin >> s;
	set<char> st;
	map<char, bool> mp;
	for (int i = 0; i < n; i++)
	{
		if (!mp[s[i]]) ans++;
		mp[s[i]]=true;
	}
	st.insert(s[0]);
	for (int i = 1; i < n; i++)
	{
		set<string> ss;
		for (auto x : st)
		{
			string temp;
			temp += x; x += s[i]; ss.insert(temp);
		}
		ans += ss.size();
		st.insert(s[i]);
	}
	cout << ans << '\n';
}

正解思路

第一种思路

从第四个样例入手:

14
bcdaaaabcdaaaa

第一种操作不好直接入手考虑,直接先考虑第二种。

  • 对于第一个 b
    • 可以删 c cd cda cdaa...共 \(13\) 种,加上自己本身就有 \(14\) 种字串。
    • 删除 b。
  • 对于第一个 c
    • 可以删 d da daa daaa等共 \(12\) 种,加上自己本身就有 \(13\) 种字串。
    • 删除 \(c\)
  • 对于第一个 d
    • 总共有 \(12\) 种字串。
    • 删除 \(d\)
  • 对于第一个 \(a\)
    • 总共有 \(11\) 种字串。
    • 删除 \(a\)

注意

此时 \(14 + 13 + 12 + 11 = 50\) 已经是正确答案了。

那么后面全是重复的,属于是从结果反过来推思路。

考虑为什么重复,因为之前出现一次的字母,其构成的子串就一定包含了后面再次出现的子串(不严谨的证明,但是这方法就是对的)。

代码实现

void solve()
{
	int n, ans = 0;
	cin >> n;
	string a;
	cin >> a;
	set<char> st;
	for (int i = 0; i < n; i++)
	{
		if (st.count(a[i])) continue;
		ans += n - i; st.insert(a[i]);
	}
	cout << ans << '\n';
}

第二种思路

考虑两种操作

  • 如果只有操作二那就是留下第一个字母加任意一个后缀。

  • 如果只有操作一那就是删去任意一个前缀,当然留下一个后缀。

推导

一定会有个后缀留下来,就枚举这个后缀是哪个。

然后这个后缀前面的位置,根据操作二还可以选一个字母。

那就记录一下不同字母个数,就是每一个后缀能贡献的个数了。

把每个后缀的贡献加起来就是答案。

代码实现

void solve()
{
	int n, ans = 0;
	cin >> n;
	string a;
	cin >> a;
	set<char> st;
	for (int i = 0; i < n; i++)
	{
		st.insert(a[i]);
		ans += (int) st.size();
	}
	cout << ans << '\n';
}

标签:insert,cin,int,Codeforces,st,后缀,ans,917,Div
From: https://www.cnblogs.com/kdlyh/p/17925572.html

相关文章

  • contentEditable实现div可编辑,控制插入节点(兼容IE)
    实现可文字编辑也可插入节点的功能展示如下:html5中contentEditable属性规定是否可编辑元素的内容,给需要编辑的节点添加contentEditable="true"。兼容性:当点击Button时在编辑框内增加节点:一开始div中加的span标签,发现有几个缺陷:点删除键时span不会删除整个,而是一个一个删除span里的......
  • 汇编-idiv有符号整数除法
     有符号除法就是将一个有符号数除以另一个有符号数有符号整数除法与无符号除法几乎相同,只有一个重要的区别:在进行除法之前,必须将被除数进行符号扩展。为了说明为何有此必要,我们先不这么做。下面的代码使用MOV将-101赋值给AX,即DX:AX的低半部分:       ......
  • Vue3之实现一个可拖拽的div
    实现一个可拖拽的div写法如下:constchatbox=ref();constdragx=(el)=>{letoDiv=chatbox.value;//当前元素letdisX=el.clientX-oDiv.offsetLeft;letdisY=el.clientY-oDiv.offsetTop;document.onmousemove=function(e){//通过事件委托,......
  • 汇编-div无符号整数除法
      在32位模式下,DIV(无符号整数除法)指令执行8位、16位及32位的无符号整数除法。无符号除法(unsigneddivision)定义为一个无符号数除以另一个无符号数。其中,除数为单个寄存器或内存操作数。格式如下: 【a=c÷b,读作c除以b(或b除c)。其中,c叫做被除数,b叫做除数】 下表给......
  • codeforces刷题(1100):1907C_div3
    C、RemovalofUnattractivePairs跳转原题点击此:该题地址1、题目大意  给定一个字符串,可以删除相邻的两个不相等的字符。问你删除后能得到最小的字符串长度为多少。2、题目解析  因为只要两个不相等的字符相邻就能消除,所以只需要找到数量最多的字符,只要它的数量比其它字......
  • CF contest 1909 Pinely Round 3 (Div. 1 + Div. 2) 题解(Vanilla的掉分赛)
    CFcontest1909PinelyRound3(Div.1+Div.2)Vanilla的掉分赛绪言PinelyRound3(Div.1+Div.2)-Codeforces\[\color{purple}\large\textbf{世界上只有一种真正的英雄主义,}\]\[\color{red}\large\textbf{就是认清了生活的真相后还依然热爱它。}\]\[\color{gray}......
  • Pinely Round 3 (Div. 1 + Div. 2)
    A构造题,分两种情况考虑上下都行,左右选一个左右都行,上下选一个voidsolve(){ intn; cin>>n; vector<pair<int,int>>a(n); for(auto&t:a)cin>>t.x>>t.y; sort(a.begin(),a.end()); boolokx=a[0].x*a.back().x>=0; for(auto&am......
  • 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......