“新智认知”杯第十七届上海大学程序设计春季联赛 C

阅读: 评论:0

“新智认知”杯第十七届上海大学程序设计春季联赛 C

“新智认知”杯第十七届上海大学程序设计春季联赛 C

题目链接:哆啦A梦传送门

 

题解:参考网上大佬神犇,这题是要数出字符串不小于m的不同总数。我们按正解的话,估计不好搞。

但题目说了一句话:

除样例外,所有的测试数据的字符串的每个字符均从小写字母 a - z 等概率随机生成。

那么我们可以从这句话得到些端倪。每个字符是等概率 (1/26) 出现的,那么我们可以打个随机数10000的表,发现当长度为8时,重复数已经稳定了,也可以这样想(1/26)^8几乎接近于0了。所以我们就直接在长度10以内,算出重复数。

随机数真好玩,又学到有个操作。

这里是随机数出现的表:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;set<string> S;
int main(){int n,m;string str;cin>>n>>m;
//    string ::iterator it=str.begin();///随机字符for(int i=0;i<n;i++){double t=rand()*100;int item=(int) t;str+=(item%26+'a');
//            it++;}int  len=str.size();LL sum=(LL)(n-m+1)*(n-m+2)/2,ans=0;int t=min(n,15);for(int i=m;i<=t;i++){S.clear();for(int j=0;j+i-1<len;j++){string op=str.substr(j,i);if(S.find(op)!&#d()){ans++;
//                cout<<op<<endl;}else S.insert(op);}///表示前i长度出现的重复数有多少printf("ans=%lldn",ans);}printf("%lldn",sum-ans);return 0;}

 

 

标程代码:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;set<string> S;
int main(){int n,m;string str;cin>>n>>m>>str;int len=str.size();///总数,等差数列前n项和LL sum=(LL)(n-m+1)*(n-m+2)/2,ans=0;int t=min(n,8);for(int i=m;i<=t;i++){S.clear();for(int j=0;j+i-1<len;j++){string op=str.substr(j,i);if(S.find(op)!&#d()){ans++;}else S.insert(op);}}printf("%lldn",sum-ans);return 0;}/*
2
dz
zz
28 50
29 24
14 25
oz*/

 

 

本文发布于:2024-01-30 14:00:01,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170659440520503.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23