题目描述
给定一个由小写字母组成的字符串,寻找包含“agnus”(羔羊)的子串的个数。注意:当且仅当两个子串的起始位置和终点不同时,这两个子串属于不同的子串。
题目解析
从头到尾遍历一次字符串,每碰到一次“agnus”“agnus”“agnus”,用“agnus”“agnus”“agnus”前面的字符数目乘上“agnus”“agnus”“agnus”后面的字符数目,即为含有当前“agnus”“agnus”“agnus”的字符串数目。
但因为要去重,所以第iii个“agnus”“agnus”“agnus”前面字符数目 需要减去 第i−1i-1i−1个“agnus”“agnus”“agnus”中“a”“a”“a”的前面的字符数目
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
ll ans;
int len,ls;
bool f[30005];
int main()
{
cin>>s;
len=s.size();
for(int i=0;i<len-4;i++)
if(s[i]=='a'&&s[i+1]=='g'&&s[i+2]=='n'&&s[i+3]=='u'&&s[i+4]=='s')
f[i]=f[i+1]=f[i+2]=f[i+3]=f[i+4]=1;
for(int i=0;i<=len;i++)
if(f[i])
{
i+=4;
ans+=(ls+1)*(len-i);
ls=4;
}
else ls++;
printf("%lld",ans);
}
本文介绍了一种算法,用于在给定的小写字母字符串中查找并计数所有不重复的'agnus'子串。通过遍历字符串并利用标记数组,该算法能高效地计算出每个'agnus'子串前后的字符数量,从而得出总的子串数目。
169

被折叠的 条评论
为什么被折叠?



