原题:
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);
}