牛客练习赛51

匿名 (未验证) 提交于 2019-12-03 00:05:01

A

链接:https://ac.nowcoder.com/acm/contest/1083/A
来源:牛客网

给出一个字符串s,你需要做的是统计s中子串”abc”的个数。子串的定义就是存在任意下标a<b<c,那么”s[a]s[b]s[c]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。
#include<bits/stdc++.h> using namespace std ; int main () {     string ch;     cin>>ch;     int k=ch.size(),a=0,b=0,c=0;     for(int i=0;i<k;i++)     {         if(ch[i]=='a')    a++;         if(ch[i]=='b')    b+=a;         if(ch[i]=='c')    c+=b;     }     cout<<c;          return 0; }

这道题刚看的时候想用搜索,但是仔细就会发现子串的记录也有规律。。。每次循环一次如果是a则记录a出现的次数,b=b+a的意思就是每次记录包含ab的子串,出现一次b便有(b+a)个(ab)子串,同理c 。循环一次就解决了。

B

链接:https://ac.nowcoder.com/acm/contest/1083/B
来源:牛客网

给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a<b<c<d<e,那么”s[a]s[b]s[c]s[d]s[e]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。

第一次做超时了。。

#include<bits/stdc++.h> using namespace std; int main() {     int n,q;     string ch;     cin>>n>>q;     cin>>ch;          while(q--)     {         int i=0,j=0;         string a;         cin>>a;         while(j<a.size()&&i<ch.size())         {             if(ch[i]==a[j])             {                 j++;             }             i++;         }         if(ch[i-1]!=a[j-1])    cout<<"NO"<<endl;         else        cout<<"YES"<<endl;     }     return 0; }

第二次参考别人代码。。

#include<bits/stdc++.h> using namespace std; string a; string str; int main() {     int n,q;     scanf("%d%d",&n,&q);     //getchar();     cin>>a;     //cout<<"a:"<<a<<endl;     while(q--)     {         cin>>str;         int position=0;         int ok=1;         int L=str.length();         for(int i=0;i<L&&ok;i++)         {             //从字符串a 下标position开始,查找字符串str[i] ,返回str[i] 在a 中的下标             auto iter=a.find(str[i],position);             //cout<<"iter:"<<iter<<endl;            // cout<<"position:"<<position<<endl;             //cout<<"npos:"<<a.npos<<endl;             if(iter==a.npos) ok=0;             //npos 是一个常数,用来表示不存在的位置(在string中找不到某个要查找的字符)             else position=iter+1;         }         if(ok) printf("YES\n");         else             printf("NO\n");     }     return 0; }

C 勾股定理

#include<bits/stdc++.h> using namespace std; int main() {     long long n;       cin>>n;       if(n<3) cout<<"-1";       else{             if(n%2==0) cout<<n*n/4-1<<" "<<n*n/4+1;             else             cout<<(n*n+1)/2<<" "<<(n*n-1)/2;       }       return 0; }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!