牛客练习赛51

https://ac.nowcoder.com/acm/contest/1083#question

A、 abc

题意:

给出一个字符串s,你需要做的是统计s中子串”abc”的个数。子串的定义就是存在任意下标a

输入描述:

一个字符串s。保证输入只包含小写拉丁字符。
1<=|s|<=1e5

输出描述:

一个整数表示s中子串”abc”的个数。

示例1

输入

abcabc

输出

4

思路:递推思想,水题

代码:

#include
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3fLL
using namespace std;
ll a,ab,abc,n;
string s;
int main()
{
    cin>>s;
    n=s.size();
    for(int i=0;i

B、字串查询

题目描述

给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a

输入描述:

第一行两个数n,q。1<=n,q<=1e5。

第二行一个长度为n的字符串s,所有字符都为小写拉丁字符。

接下来q行每行一个字符串t。1<=|t|<=50。

输出描述:

对于每个查询,如果t是s的字串,输出”YES”,否则输出”NO”。每个答案占一行。

示例1

输入

 

8 4
ababcbaa
abac
accb
aaaa
abcba

输出

 

YES
NO
YES
YES

思路:因为太长,无法直接匹配,因为只有26个小写字母,可以记录其位置,然后依次查询符合条件的尽可能的左边的位置。

代码:

#include
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3fLL
#define maxn 100010
using namespace std;
int q,n,k;
char s[maxn],t[55];
vectorv[30];
void init()
{
    for(int i=0;ifa) r=mid;
        else l=mid;
    }
    if(r>=v[rt].size()) return -2;
    return v[rt][r]>fa?v[rt][r]:-2;
}
int main()
{
    scanf("%d%d",&n,&q);
    scanf("%s",s);
    init();
    while(q--)
    {
        scanf("%s",t);
        k=strlen(t);
        int l=-1;
        for(int i=0;i
C题是个结论题,身为数学系的我不会。。。

D、羊吃草

 

题目描述

有一个草原可以用一个1~400的数轴表示。有n头羊和q个查询。每头羊的编号分别是1,2,3…n。第i头羊只喜爱数轴上[ai,bi]这样的一个闭区间,每一时刻每头羊只可能在自己喜爱的区间的某个点上吃草。现在给出q个查询,每个查询两个整数l,r。你需要计算出在同一时刻,最多能有多少头羊同时在这个区间内吃草。数轴上每一个整点同一时刻只能容纳一只羊,羊只会在整点吃草。

输入描述:

第一行三个数n q。

第二行n个数a1 a2…an。

第三行n个数b1 b2…bn。

接下来q行每行两个数l,r。表示询问的区间。

输出描述:

对于每个查询,输出一个整数表示答案。

示例1

输入

 

5 3
1 1 1 2 4
1 1 1 3 5
1 5
2 5
1 3

输出

 

3
2
2

备注:

1<=n,q<=400

1<=ai<=bi<=400

1=l<=r<=400

思路:先讲样的区间按左端点排序,对于当前询问区间,依次从左到右每个位置安排羊吃草,左端点<=当前位置的,将其右端点加入multiset,multiset内的羊一定是可以在当前点吃草的,安排的最优是右端点小的那只,贪心思想吧。(开完班会回来有继续写的,中间断思路 了,所以写的很乱,但是1A,哈哈,胆大,过样例就交,但是讲真写的有些乱!)

代码:

#include
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3fLL
#define maxn 500
using namespace std;
struct AA
{
    int l,r,rt;
    bool operator <(const AA&aa) const
    {
        return ls;
        multiset::iterator it;

        int a=l,ans=0,c;
        for(int i=1;i<=n&&a<=r;)
        {
            while(pos[i].l<=a&&i<=n) {s.insert(pos[i].r);i++;}
            while(!s.empty())
            {
                it=s.begin();
                c=(*it);
                //cout<=a) {s.erase(s.begin());ans++;a++;}
            while(!s.empty())
            {
                it=s.begin();
                c=(*it);
                //cout<

 

你可能感兴趣的:(牛客练习赛51)