题目大意:
给定一个长度为n 的字符串S,你可以在字符串S 后再添加m 个字符,
使得新字符串T 所包含的不同的子序列数量尽量多。求最多的不同子序
列数量,答案模大质数

solution:
设lasti 为字符i 上次出现的位置
当前这位应该填上lasti 最小的字符
设Fi 表示以第i 位结尾的新出现的不同子序列个数,Gi 为Fi 的前缀和
Fi = G[i-1] - G[last[si]-1]
这个计算答案的式子也证明了上面的贪心
O((n + m)*26)

有一些细节问题
比如如果lastsi=0,Fi=G[i-1]+1
还有减法一定要先+mod···
还有开long long

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define inf 0x3f3f3f3f
#define maxn 2000005
#define LL long long
using namespace std;
int k,n,m,a[maxn],last[30];
char s[maxn];
const int mod=1e9+7;
LL g[maxn],f[maxn];
inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') {if(c=='-')f=-1;c=getchar();}while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}int main(){m=rd(); k=rd();scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++){a[i]=s[i]-'a'+1;if(last[a[i]]<1) f[i]=(g[i-1]+1)%mod,g[i]=(f[i]+g[i-1])%mod;else f[i]=(g[i-1]+mod-g[last[a[i]]-1])%mod,g[i]=(f[i]+g[i-1])%mod;last[a[i]]=i;}for(int i=n+1;i<=n+m;i++){int aim=0,minn=inf;for(int j=1;j<=k;j++)//没认真读题wa了一次···这里只能到kif(minn>last[j]) aim=j,minn=last[j];a[i]=aim;if(last[aim]<1) f[i]=(g[i-1]+1)%mod,g[i]=(f[i]+g[i-1])%mod;else f[i]=(g[i-1]+mod-g[last[aim]-1])%mod,g[i]=(f[i]+g[i-1])%mod;last[aim]=i;//哇这个地方忘记+mod了wa了两遍}printf("%lld\n",(g[n+m]+1)%mod);return 0;
}

贪心--CF645E相关推荐

  1. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  2. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  3. Too Many Segments CF595D 贪心乱搞

    传送门! 比赛的时候没有时间写了,看看了看大佬的代码,学习学习. 一开始实验室大佬说是用差分写的,但是看了代码发现打cf的人大家都是stl狂魔! 贪心思路:区间按照左端点排序,从1~2e5遍历每一个点 ...

  4. Roundgod and Milk Tea 贪心

    这个题好像可以用一种类似与置换的贪心方法来做~ sum记为剩余奶茶,一开始sum等于奶茶和 ans记录已经喝的奶茶数 不用排序,我们就从前往后直接处理,考虑的是每一个班最多可以喝多少杯奶茶 就是从剩余 ...

  5. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  6. 贪心:expedition 最优加油方法

    已知一条公路上,有一个起点与一个终点,这之间有n个加油站;已知从这n个加 油站到终点的距离d与各个加油站可以加油的量l,起点位置至终点的距离L与起 始时刻油箱中汽油量P;假设使用1个单位的汽油即走1个 ...

  7. 贪心:Burst Balloons 最少次数完成射击气球

    已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...

  8. 贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)

    一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少 ...

  9. 贪心:Jump Game 跳跃游戏

    一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回是t ...

最新文章

  1. java static关键字_好程序员Java教程分享static关键字的理解
  2. find 命令的参数详解
  3. 计算机系统怎么算页面大小,电脑网页的设计尺寸是多少
  4. 数据结构与算法--B树原理及实现
  5. 小学音乐教学和计算机的融合,小学学科教学与计算机深度融合赛课心得体会(共4篇)...
  6. SQL中关于EXISTS谓词的理解
  7. mysql字段A复制到字段B,并替换指定字符
  8. html快捷键_Mac进阶:掌握这 5 个冷门快捷键,让Mac更好用
  9. matlab分析xml文件_修改Java中的XML文件(DOM分析器)
  10. 791A.Bear and Big Brother
  11. 摄氏温度和华氏温度换算(vb源码)
  12. Duilib学习笔记(一)—— 环境搭建
  13. new_picview_PicView图片浏览器
  14. vue 时间格式总结及转换
  15. 电脑虚拟服务器云主机运维论坛,虚拟服务器云主机论坛
  16. 翻译python代码的软件_科普 | 内外翻,你是不是一直搞反了?
  17. FusionCharts--WEB图表技术
  18. 视频文件服务器加速,视频CDN,视频点播加速,视频点播CDN加速,CDN流媒体点播加速_速网云计算CDN服务商·卓越的互联网业务平台提供商...
  19. 杨振宁李政道分手内幕
  20. Linux初装gitlab初始默认密码

热门文章

  1. 从幻想到现实,虚拟人的成长之路
  2. 雷电2接口_雷电3和Type-C接口一样吗?差别很大
  3. 关于智能车三岔路识别
  4. 惠普打印机卡纸问题,解决.
  5. 高丽参的作用与功效及忌讳
  6. 揭开 LVS 神秘的面纱
  7. 解读工业互联网建设中的安全保障
  8. Linux中ibus输入法中全拼和双拼的问题+解决VNCserver切换不成功问题
  9. 查看git HEAD
  10. ABB机器人编程随记