2017.1.15【初中部 NOIP提高组】模拟赛B组 寻找羔羊(agnus) 题解

原题:

http://172.16.0.132/senior/#contest/show/1899/0

题目描述:

给定一个由小写字母组成的字符串,寻找包含“agnus”(羔羊)的子串的个数。注意:当且仅当两个子串的起始位置和终点不同时,这两个子串属于不同的子串。

输入:

只有一个字符串,表示题中所述的字符串。

输出:

仅一个数字,表示满足题意的子串个数。

样例输入:

agnusbgnus

样例输出:

6

样例解释:

6个子串分别是:agnus、agnusb、agnusbg、agnusbgn、agnusbgnu、agnusbgnus。

数据范围限制:

对于 40%的数据,字符串长度<=1000
对于 100%的数据,字符串长度<=30000

分析:

从头到尾遍历一次字符串,每碰到一次“agnus”,用“agnus”前面的字符数目乘上
“agnus”后面的字符数目,即为含有当前“agnus”的字符串数目。直接统计即可,不过要注意去重。

实现:

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;

string s;
int ans,i,t,l[30007],r[30007];
int main()
{
    cin>>s;
    s='0'+s;
    for(i=0;i<=s.length()-4;i++)
        if(s[i]=='a'&&s[i+1]=='g'&&s[i+2]=='n'&&s[i+3]=='u'&&s[i+4]=='s')
        {
            t++;
            l[t]=i;
            r[t]=i+4;
        }
    for(i=1;i<=t;i++) ans+=(l[i]-l[i-1])*(s.length()-r[i]);
    printf("%d",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值