每晚思维

  • 一、循环子串
  • 二锦标赛,思维风暴
  • 三、蒟蒻(map容器的删除操作)
  • 四、子串分值
  • 五、子串分值和

一、循环子串

遇到字符串循环时,也就是需要首尾相连时

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;int main(){int t;cin>>t;string s;while(t--){int n;cin>>n;cin>>s;s+=s;//涉及到循环子串,要将原字符串首尾相连 bool f=true;for(int len=2;len<=n;len++){for(int i=0;i+len<n;i++){//双重循环枚举所有子串 string str=s.substr(i,len);reverse(str.begin(),str.end());if(s.find(str)==s.npos){f=false;break; }}if(!f)break;} if(f)cout<<"YES";else cout<<"NO";if(t)cout<<endl;} return 0;
} 

二锦标赛,思维风暴

当题目问有多少种可能,我们可以反过来求不能,“正难则反”),总数减去不可能即可。必胜的必定是最大的,往后遍历看是否出现断层

要最后剩下的选手尽可能多,最大的肯定留下来,要尽可能拿大的和最大的比,小的直接就淘汰了,只是可能获胜的玩家,并不是一局中获胜的玩家

1、最大的那个肯定会留下
2、尽可能让更大的x(仅次于y)和较大的y去比较,因为若x输宇y,
小于x的数和y比较一定牺牲 ,x总要和y比,那么小于y的全部牺牲
但是x不一定输于y,在某一局中就可能取胜,那么小于x的数胜负情况就要 按以上套路重定了

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int a[N];
int main(){int n,k;cin>>n>>k;for(int i=0;i<n;i++){cin>>a[i];}sort(a,a+n);int res=0;for(int i=n-2;i>=0;i--){if(a[i+1]-a[i]<=k)res++;else break;//牺牲了此大于a[i+1]的,小于a[i+1]的一定全部牺牲 }  cout<<res+1;//加上最大的那个 return 0;
} 
#include <iostream>
#include <map>
using namespace std;
const int N=105;
int main(){map<int,string> mp;mp[1]="123";mp.insert({2,"222"});mp.insert({3,"222"});mp.erase(mp.begin());
//  mp.erase(1);效果相同
//  map的erase函数里面,既可以是值也可以是迭代器 for(map<int,string>::iterator it=mp.begin();it!=mp.end();it++){cout<<it->first<<" "<<it->second<<endl;}return 0;
} 

三、蒟蒻(map容器的删除操作)

#include <iostream>
#include <map>
#include <algorithm>
#define int long long
using namespace std;
//const int N=1e5+5;
map<int,int> mp1;//既然要按照两个标准分别排序,那就分别用两个容器存
//方便分别找到两个标准下的最小值,删去某个商品时两个容器中都要删去
map<int,int> mp2;
signed main(){ios::sync_with_stdio(false);cin.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){int op,w,t;cin>>op;if(op==1){cin>>w>>t;if(mp1.count(w)==0&&mp2.count(t)==0){mp1.insert({w,t});mp2.insert({t,w});}}else if(op==2){//删除w最小的商品,在mp1中排在最前 mp2.erase(mp1.begin()->second);mp1.erase(mp1.begin());
//          mp2.erase(mp1.begin()->second);顺序绝对不能反呀!
//删除了mp1.begin那么下一次访问mp1.begin就不是当初的那个了 }else if(op==3){mp1.erase(mp2.begin()->second);mp2.erase(mp2.begin());
//          mp1.erase(mp2.begin()->second);}}int res=0;
//  for(auto x:mp1)res+=x.first;for(map<int,int>::iterator it=mp1.begin();it!=mp1.end();it++)res+=it->first;cout<<res; return 0;
} 

四、子串分值

子串分值是在子串中只出现一次的的个数总和
子串分值和是在子串中出现的不同字符的个数总和
参考思路

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int pre[N];//pre[i]表示第i个字符ch前面最近的ch的位置
int nex[N];
int a[30];
int main(){//枚举所有子串,累计所有子串中 某个只出现一次的字母的个数
//双重循环枚举所有子串超时
//该字符串中每个字母对某些子串的贡献值累加起来
//比如 abcadba,排在第四位的字母a对子串bca,ca,ad,adb这些子串都有贡献
//这个a对结果的贡献就是4,这些子串的个数 string s;cin>>s; s="0"+s;int n=s.size()-1;for(int i=1;i<=n;i++){char ch=s[i];pre[i]=a[ch-'a'];a[ch-'a']=i;
//s[i]这个字符(记作ch)的位置,那么下一次碰到j位置的ch这个字符,
//pre[j]=a[s[i]-'a']}for(int i=0;i<26;i++)a[i]=n+1;//假设极端情况,s由n个不同字符组成
//  第i个字符有贡献的子串个数是(i-pre[i])*(nex[i]-i)
//  由于可能找不到后面最近的一个相同字符,那么nex的值就算做n+1 for(int i=n;i>=1;i--){char ch=s[i];nex[i]=a[ch-'a'];a[ch-'a']=i;
//s[i]这个字符(记作ch)的位置,那么下一次碰到j位置的ch这个字符,
//nex[j]=a[s[i]-'a']}int res=0;for(int i=1;i<=n;i++)res+=(i-pre[i])*(nex[i]-i);cout<<res;return 0;
}

五、子串分值和

字串分值和同样是从贡献度的角度考虑,只是 只需要考虑前一个相同字符的位置,因为第i个字符能贡献到的子串个数
ababcabc
第i个字符后面与他相同的字符的最近位置、个数有多少个都无所谓,对所有子串的贡献值都是1,但是,要考虑前一个相同字符的位置,因为 如果把前一个最近相同字符也重新算一个子串将重复
比如对于下标为3的字符a,下标为1的字符a有贡献的子串 已经包含所有 a1…a2,a1…a2…a3这些子串,所以a2贡献的子串不能再包含a1
所以贡献的子串个数是(i-pre[i])*(n-i+1)

注意数据范围,贡献综合会爆int

#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
const int N=1e6+5;
int pre[N];//pre[i]表示第i个字符ch前面最近的ch的位置
int a[30];
signed main(){string s;cin>>s; s="0"+s;int n=s.size()-1;int res=0;for(int i=1;i<=n;i++){pre[i]=a[s[i]-'a'];res+=(i-pre[i])*(n-i+1);a[s[i]-'a']=i;}cout<<res;return 0;
}

每日思维风暴(子串分值、子串分值和)相关推荐

  1. 怎样从计算机科学到神经科学,《化腐为奇 从元素周期表到纳米技术 万物有识 从脑认知到思维风暴,神经科学趣史 无所不能 从逻辑运算到人工智能,计算机科学趣史》—甲虎网一站式图书批发平台...

    <化腐为奇 从元素周期表到纳米技术 万物有识 从脑认知到思维风暴,神经科学趣史 无所不能 从逻辑运算到人工智能,计算机科学趣史>内容简介: <化腐为奇 从元素周期表到纳米技术> ...

  2. poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)

    题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 可是大部分时间是在调试代码.由于模板的全局变量用混了,而自 ...

  3. 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符

    Minimum Window Substring 原题链接Minimum Window Substring 要求在源字符串s中找到长度最短的子串,这个子串包含目标字符串t中的所有字符,字符顺序没有要求 ...

  4. 关于字符串子串 真子串 非空子串 非空真子串的求解方法

    子串的求解方法 公式:n(n+1)/2 +1 子串是一个字符串中连续的一段,将它抽象为周围有边界的一串字符,如"abcde",你可以把子串"bc"抽象为&quo ...

  5. 《思维风暴》收获表述

    作者:张振祥 金盾出版社出版 ISBN978-7-5186-1420-2 以上是书本信息,以防开火同名书本.以下是个人暴论,本人观点受本人学识束缚,故会有大量情绪化表达.   首先是个人感觉上的定性, ...

  6. HTML5小游戏《智力大拼图》发布,挑战你的思维风暴

    一,前言 本游戏是鄙人研究lufylegend数日之后,闲暇之余写下的.本游戏运用全新的技术HTML5写成的.游戏引擎为国产的lufylegend.js,大家可以去它的官网看看.游戏处于测试阶段,希望 ...

  7. 思维风暴 codeforces (1060A) Phone Numbers

    这个题我真是我的问题,我看到这种题直接就想着怎么用string去枚举破解,开了一个数组去做结果模拟失败,可能开个stl容器能做的好一点...但是这个题完全不是这样做的...实际上直接比较8的个数和合法 ...

  8. Codeforces #208 div2前两题及思维风暴

    昨晚原本准备在宿舍打cf的,结果吵吵闹闹的,也没打成,头也晕晕的,当时看了只看了第一个题,越想越麻烦,最后竟然陷入了误区,半小时也没解,虽然注册了,一发也没交... A. Dima and Conti ...

  9. 【思维风暴】算法迭代和递归的理解

    文章目录 递归与迭代 递归消耗内存的缺点 为什么要有迭代 需要用迭代消解递归的情况 不需要消解的递归 结束语 递归与迭代 递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构.递归与迭代都涉及 ...

最新文章

  1. 动态规划python_机器人是如何规划路径的?动画演示一下吧
  2. os的进程调度(读书笔记)
  3. RocketMQ架构模块解析
  4. (转)linux运行tomcat时JRE_HOME显示不对怎么办?
  5. mysql查询每个机构下的账号总数_MySQL高可用方案:实践篇
  6. Girton College Info Session Abstract
  7. QT的QScriptValue类的使用
  8. 一个优秀的Push平台,需要经历怎样的前世今生
  9. HTML+CSS+JS实现 ❤️slicebox酷炫3d图片轮播切换❤️
  10. MYSQL远程登录报错: Error No. 2003
  11. 凯西·奥尼尔:盲目信仰大数据的时代必须结束 | 算法密码
  12. NRR52832 获取扫描请求
  13. canvas :五角星的代码实现
  14. 序列化(boost serialization)
  15. Lock-Free编程简介
  16. 软件项目工作量估算方法解析
  17. 小米物联网世界第一_雷军:小米智能设备连接数世界第一 AI+IoT是核心战略
  18. 织梦网站 mysql,织梦(DEDECMS)网站程序及数据库迁移搬家教程
  19. Web3中文|NFT如何促进教育的发展?
  20. 16进制编码与字符编码的相互转化

热门文章

  1. Java Regex Pattern Matcher
  2. Oracle错误一览表
  3. WinRTP Programmer's Guide 翻译
  4. 分享一些我常用的游戏开发素材网站
  5. EAS自定义导入Excel数据功能
  6. 判断鼠标移入移出方向(二)-----获取鼠标移入方向
  7. 保存的html打不开怎么办,win7系统收藏夹里储存的网页都打不开的解决方法
  8. DSPack初次使用小结
  9. matlab读取、播放wav文件
  10. 薄膜表面检测仪帮助企业节省人力保障产品质量