牛客练习赛51

我们两清 提交于 2019-11-29 14:32:57

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;
}

 

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