CF1748B Diverse Substrings 题解
简要题意
给定一个长度为
分析
题目拿到手,先想暴力解法。我们可以直接枚举
for(int i=1;i<=n;i++){ memset(cnt,0,sizeof(cnt)); maxn=0; sum=0; for(int j=i;j<=n;j++){ int pos=a[j]; if(!cnt[pos]) sum++; cnt[pos]++; maxn=max(maxn,cnt[pos]) if(sum>=maxn) ans++; } }
显然,这种
优化
显然,所有的数字个数不会超过
for(ll j=i;j<=n;j++)
改成
for(ll j=0;j+i<=n&&j<=100;j++)
这样就可以将我们的时间复杂度优化到
完整代码
#include<bits/stdc++.h> #define ll long long #define ma 214514 using namespace std; ll read(){ char ch=getchar(); ll x=0,f=1; while('0'>ch||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while('0'<=ch&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f; } ll t; ll n; ll cnt[10]; ll maxn; ll a[ma]; ll ans=0; ll sum=0; char x; int main(){ t=read(); while(t--){ n=read(); memset(cnt,0,sizeof(cnt)); ans=0,sum=0; for(ll i=1;i<=n;i++){ x=getchar(); a[i]=x-'0';//读入时转化成字符读入,防止读入一长串数字 } for(ll i=1;i<=n;i++){ memset(cnt,0,sizeof(cnt)); maxn=0; sum=0; for(ll j=0;j+i<=n&&j<=100;j++){ ll pos=a[j+i]; if(!cnt[pos]) sum++; cnt[pos]++; maxn=max(maxn,cnt[pos]); if(sum>=maxn) ans++; } } printf("%lld\n",ans); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构