【入门OJ】2003: [Noip模拟题]寻找羔羊

这里可以复制样例:
样例输入:
agnusbgnus
样例输出:
6
这里是链接:【入门OJ】2003: [Noip模拟题]寻找羔羊
这里是题解:
题目是求子串个数,且要求简单去重。
对于一个例子(agnus这个单词只出现过一次):abcagnusbgnus
它的满足子串就有以下几种情况:
①自身:agnus;
②和前面的字符组合:abcagnus、bcagnus、cagnus;
③和后面的字符组合:agnusbgnus、agnusbgnu、agnusbgn、agnusbg、agnusb;
④两边都组合:abcagnusbgnus、abcagnusbgnu、abcagnusbgn、abcagnusbg、abcagnusb、bcagnusbgnus、bcagnusbgnu、
bcagnusbgn、bcagnusbg、bcagnusb、cagnusbgnus、cagnusbgnu、cagnusbgn、cagnusbg、cagnusb;
所以首先对于只出现过一次的来说:ans+=(前面字符个数+后面字符个数+前面字符个数*后面字符个数+1);
简化一下就是:ans+=(前面字符个数+1)*(后面字符个数+1);
然而这只是对于只出现过一次的情况。因为要有去重操作,所以并不能直接用于多次出现情况。
首先看重复出现的情况:如果将样例*2:agnusbgnusagnusbgnus
按照以上操作的话:算第一个羔羊会出现:agnusbgnusagnusb(和后面的字符组合)
算第二个羔羊的时候也会出现同样子串:(两边都组合)
所以能看出,对于每个羔羊,利用只出现一次的情况来解决是有区间限制的。而这个区间就是向前不能延伸到
之前出现的羔羊,向后无限延伸。(反之,也成立)
具体的区间就是:
①前区间:上一个agnus的a位置到当前agnus的a位置前一个的位置。
②后区间:当前agnus的s位置后一个的位置到最后一个位置。
(因为求ans是前后都要加1的,所以前区间直接是agnus的a位置,后区间直接是agnus的s位置)
这里是AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAXN 30010
using namespace std;
char str[MAXN];
char goal[]="agnus";
int l[MAXN],r[MAXN]; //记录区间
int len,ans;
int cont; int main(){
cin>>str+;
len=strlen(str+);
for(int i=;i<=len;i++){
int cnt=;bool flag=;
while(str[i]==goal[cnt]){
i++;cnt++;flag=;
if(cnt==){
cont++;
i--;flag=;
l[cont]=i-;
r[cont]=i;
break;
}
}
if(flag==) i--;//因为while循环里面i多加了一次,所以减回来。
}
for(int i=;i<=cont;i++){
ans+=(l[i]-l[i-])*(len-r[i]+);
}
printf("%d\n",ans);
return ;
}
【入门OJ】2003
梦想总是要有的,万一实现了呢?
【入门OJ】2003: [Noip模拟题]寻找羔羊的更多相关文章
- NOIP模拟题汇总(加厚版)
\(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...
- 9.9 NOIP模拟题
9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...
- 8.22 NOIP 模拟题
8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...
- NOIP模拟题17.9.26
B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...
- noip模拟题题解集
最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...
- 一些noip模拟题一句话题解
Problem A: 序列 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 12 Solved: 9[Submit][Status][Web Boar ...
- NOIP 模拟题
目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...
- 9.22 NOIP模拟题
吉林省信息学奥赛 2017 冬令营 ...
- 6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)
Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...
随机推荐
- ASP.NET获取汉字拼音的首字母
代码 #region GetChineseSpell获取汉字拼音的第一个字母 //获取汉字拼音的第一个字母 static public string GetChineseSpell(string st ...
- JVM知识(下)
目录 方法区 类型信息 方法信息 类变量 引用类的类加载 类引用 堆(Heap) GC 定义对象 数组引用 栈 栈帧 操作数栈 帧数据 本次主要介绍,JVM的方法区,堆,栈.以下内容主要还是参考< ...
- Python不生成HTMLTestRunner报告-转载学习
1.问题:Python中同一个.py文件中同时用unittest框架和HtmlReport框架后,HtmlReport不被执行. 2.为什么?其实不是HtmlReport不被执行,也不是HtmlRep ...
- RyuBook1.0案例三:REST Linkage
REST Linkage 该小结主要介绍如何添加一个REST Link 函数 RYU本身提供了一个类似WSGI的web服务器功能.借助这个功能,我们可以创建一个REST API. 基于创建的REST ...
- 从零开始的Python学习Episode 13——常用模块
模块 一.time模块 时间戳(timestamp) :时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. 元组(struct_time) :struct_time元组共有9 ...
- HTML5+Bootstrap 学习笔记 2
navbar升级 从Bootstrap 2到Bootstrap 3 1. .navbar-inner已从Bootstrap 3中去除. 2. <ul class="nav"& ...
- [笔记] mysql5.6一些编译参数
cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE ...
- mysql优化建议21条
转自: http://blog.csdn.net/waferleo/article/details/7179009 今 天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于 ...
- 扩展Lucas定理 扩展Lucas板子
题意概述:多组询问,给出N,K,M,要求回答C(N,K)%M,1<=N<=10^18,1<=K<=N,2<=M<=10^6 分析: 模数不为质数只能用扩展Lucas ...
- ORACLE公司传奇历史
ORACLE公司传奇 ORACLE公司之起源 很难想象,ORACLE 公司的这一段传奇居然要从 IBM 公司开始. 1970年的6月,IBM 公司的研究员埃德加·考特 (Edgar Frank Cod ...