比赛地址: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