比赛地址:https://ac.nowcoder.com/acm/contest/11172
A:
利用O(n)复杂度枚举每个"mocha"在字符串中的开头位置,存入数组当中。
再用O(n)复杂度枚举第一次出现"mocha"的位置,第二次出现"mocha"的位置......和第k+1次出现"mocha"的位置,第k+2次出现"mocha"的位置......
计算两次出现之间有多少个字符即可
#include<bits/stdc++.h>
using namespace std;
const int INF=1e6;
vector<int> a;
string s,b="mocha";
int main()
{
int n,k;
cin>>n>>k;
cin>>s;
for(int i=0;i<n;i++)
{
int f=0;
for(int j=0;j<5;j++)
{
if(s[i+j]!=b[j])
{
f=1;
break;
}
}
if(f==0) a.push_back(i);
}
int ans=INF;
for(int i=0;i<a.size();i++)
{
if(i+k-1>=a.size()) break;
ans=min(ans,a[i+k-1]+5-a[i]);
}
if(ans==INF)
{
printf("poor Mocha\n");
}
else
{
printf("Mocha suki!\n");
printf("%d\n",ans);
}
return 0;
}B:
由上面这个公式可知,结果的商就是组合数,而组合数必定是整数,所以:
而操作1和操作2改变后的数依然是i的倍数,所以操作3的答案都是0
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int id,l,r,k;
scanf("%d%d%d",&id,&l,&r);
if(id==2) scanf("%d",&k);
if(id==3)
{
printf("0\n");
}
}
return 0;
}官方题解:https://ac.nowcoder.com/discuss/655940?type=101&order=0&pos=13&page=1&channel=-1&source_id=1

京公网安备 11010502036488号