当前位置: 首页 > news >正文

字符串统计

字符串统计

内存限制:512MB
时间限制:1.000s
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

题解:

30分做法
暴力枚举长度大于等于 3的子串,每个子串循环查找

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
using namespace std;
const int N=1e5+10;
const int mod=1e6+3;
int main()
{ios::sync_with_stdio(false);cin.tie(0);freopen("string.in","r",stdin);freopen("string.out","w",stdout);int n;string s;cin>>n>>s;s=" "+s;ll ans=0;for(int len=3;len<=n;len++){for(int i=1;i+len-1<=n;i++){int j=i+len-1;int x=0,y=0;for(int k=i;k<=j;k++){if(s[k]=='H') x++;else y++;}if(x==1||y==1) ans++;}}cout<<ans;return 0;
}

60分做法
暴力枚举长度大于等于 3的子串,前缀和O(1)时间查找

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
using namespace std;
const int N=1e5+10;
const int mod=1e6+3;
int main()
{ios::sync_with_stdio(false);cin.tie(0);freopen("string.in","r",stdin);freopen("string.out","w",stdout);int n;string s;cin>>n>>s;s=" "+s;ll ans=0;vector<int> cnt(n+10);for(int i=1;i<=n;i++) cnt[i]=cnt[i-1]+(s[i]=='H');for(int len=3;len<=n;len++){for(int i=1;i+len-1<=n;i++){int j=i+len-1;if(cnt[j]-cnt[i-1]==1||cnt[j]-cnt[i-1]==j-i) ans++;}}cout<<ans;return 0;
}

100分做法
我们用一个数组记录每一个 G所在的位置,再用一个数组记录每一个 H所在的位置。
例如样例中, a数组中存 G所在的位置为 1,3,5, b数组中存 H所在的位置为 2,4。
遍历整个字符串,求以当前字符为中心的满足条件的子串数量,若当前字符为 G,则在 a数组中查找
当前字符左右两侧第一个 G的位置,记作 l,r,则 [l+1,r-1]就是只包含一个 G的范围。

  • 若找到的区间长度小于 3,则不记录。
  • 若找到的区间长度大于等于 3,根据区间范围内 G两侧 H的数量,计算子串数量
  • 对于 H同样操作。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
using namespace std;
const int N=5e5+10;
const int mod=1e6+3;
int a[N],b[N],cnt,tot;
int main()
{ios::sync_with_stdio(false);cin.tie(0);freopen("string.in","r",stdin);freopen("string.out","w",stdout);int n;string s;cin>>n>>s;s=" "+s;a[++cnt]=0,b[++tot]=0;for(int i=1;i<=n;i++){if(s[i]=='G') a[++cnt]=i;else b[++tot]=i;}a[++cnt]=n+1,b[++tot]=n+1;ll ans=0;for(int i=2;i<cnt;i++){int l=a[i-1]+1;int r=a[i+1]-1;int p=a[i];if(r-l+1<3) continue;ll x=p-l;ll y=r-p;if(x>1) ans+=x-1;if(y>1) ans+=y-1;if(x>=1&&y>=1) ans+=x*y;}for(int i=2;i<tot;i++){int l=b[i-1]+1;int r=b[i+1]-1;int p=b[i];if(r-l+1<3) continue;ll x=p-l;ll y=r-p;if(x>1) ans+=x-1;if(y>1) ans+=y-1;if(x>=1&&y>=1) ans+=x*y;}cout<<ans;return 0;
}
http://www.dtcms.com/a/516503.html

相关文章:

  • Docker与Tomcat:一键部署Java Web应用的完美组合
  • 【同步/异步 日志系统】 --- 前置技术
  • 图论基础和表示
  • 网站建设为了什么怎么看网站谁做的
  • [小白]spring boot接入emqx
  • Spring Boot 实现GZIP压缩优化
  • Spring Boot使用Redis实现消息队列
  • 互联网大厂Java面试实战:以Spring Boot与微服务为核心的技术场景剖析
  • 做网站页面的软件毕业设计网站成品
  • 《一个浏览器多人用?Docker+Neko+cpolar实现跨网共享》
  • design设计网站网站优化方法页面
  • C++基础:(十七)模版进阶:深入探索非类型参数、特化、分离编译与实战技巧
  • 《Git:从入门到精通(五)—— Git:Gitee远程仓库创建与克隆指南》
  • UML学习文档(一)
  • 淘宝放单网站开发网站wordpress错误
  • Latex中的错误汇总
  • huggingface transformers调试问题--加载本地路径模型时pdb断点消失
  • KMP算法详解 -- 串的模式匹配
  • 用php做网站的方法学网站建设前途
  • 网站不用下载免费软件曰本孕妇做爰网站
  • 【微信小程序 + 消息订阅 + 授权】 微信小程序实现消息订阅流程介绍,代码示例(仅前端)
  • 网站开发找哪家什么查网站是否降权
  • 【经典书籍】C++ Primer 第13类继承精华讲解
  • “VMware与vmx86驱动程序版本不匹配:预期为:417,实际为416。”解决步骤,亲测有效!!!
  • 查找组成一个偶数最接近的两个素数
  • 获取文件版本(C++源码)
  • 济南网站建设鲁icp备附近展览制作工厂
  • 在Windows WSL2中安装Ubuntu和Docker的完整指南
  • Ubuntu 22 .04安装CUDA, cuDNN, TensorRT
  • Linux编辑神器——vim工具的使用