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