一个字符串,由前k个字母组成,长度为m + n,其中前m个字符已经确定,后面n个由你自由选择,

使得这个串的不同的子序列的个数最多,空串也算一个子序列。

1 <= m <= 10^6,0 <= n <= 10^6,1 <= k <= 26

首先,我们考虑n = 0的情况,

问题就为给定一个字符串,求它有多少个不同的子序列。

pre[i]表示字母i最后出现的位置,初始化为0

f[i]表示以第i个字符结尾的与前面已经出现的子序列都不同的子序列个数

g[i] = ∑0<=j<=if[j]

则我们知道f[i] = ∑pre[i]<=j<=i-1f[j]

则 if pre[i] == 0  then f[i] = g[i-1]

if pre[i] > 0    then f[i] = g[i-1] - g[pre[str[i]]-1]

答案就是g[m]

那如果n > 0 呢?

从f的递推式我们知道,要使得f[i]最大,i处填的字符应该是pre值最小的i

那么我们接着遍历,每次拿pre最小的字符,更新f和pre值

最终答案就是g[n + m]

代码:

  //File Name: cf645E.cpp
//Created Time: 2017年01月05日 星期四 13时53分24秒 #include <bits/stdc++.h>
#define LL long long
#define fir first
#define sec second
#define pii pair<int,int>
using namespace std;
const int MAXN = + ;
const int P = (int)1e9 + ;
LL f[MAXN],g[MAXN];
char str[MAXN];
int pre[];
set<pii> rem;
LL solve(int n,int k){
int m = strlen(str + );
memset(pre,,sizeof(pre));
f[] = g[] = ;
for(int i=;i<=m;++i){
int v = str[i] - 'a';
if(pre[v] == )
f[i] = g[i - ];
else
f[i] = (g[i - ] - g[pre[v] - ] + P) % P;
g[i] = (g[i - ] + f[i]) % P;
pre[v] = i;
// printf("i = %d f = %lld g = %lld\n",i,f[i],g[i]);
}
rem.clear();
for(int i=;i<k;++i)
rem.insert(pii(pre[i],i));
for(int i=m+;i<=m+n;++i){
// puts("ffff");
pii now = *rem.begin();
int pos = now.fir,v = now.sec;
if(pos == )
f[i] = g[i - ];
else
f[i] = (g[i - ] - g[pos - ] + P) % P;
g[i] = (g[i - ] + f[i]) % P;
pre[v] = i;
rem.erase(rem.begin());
rem.insert(pii(i,v));
}
// for(int i=0;i<=m+n;++i)
// printf("i = %d f = %lld\n",i,f[i]);
return g[m + n];
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
scanf("%s",str + );
printf("%lld\n",solve(n,k));
return ;
}

codeforces 645 E. Intellectual Inquiry的更多相关文章

  1. Codeforces 645E. Intellectual Inquiry(DP,贪心)

    Codeforces 645E. Intellectual Inquiry 题意:给定一串字符,由前k个小写拉丁字母组成,要求在该字符串后面补上n个字符(也从前k个小写拉丁字母里面选),使得最后得到的 ...

  2. CROC 2016 - Elimination Round (Rated Unofficial Edition) E. Intellectual Inquiry 贪心 构造 dp

    E. Intellectual Inquiry 题目连接: http://www.codeforces.com/contest/655/problem/E Description After gett ...

  3. CROC 2016 - Elimination Round (Rated Unofficial Edition) E - Intellectual Inquiry dp

    E - Intellectual Inquiry 思路:我自己YY了一个算本质不同子序列的方法, 发现和网上都不一样. 我们从每个点出发向其后面第一个a, b, c, d ...连一条边,那么总的不同 ...

  4. codeforces 645E . Intellectual Inquiry

    题目链接 如果不考虑重复的元素, 那么我们可以很容易的发现, 长度为n的字符串它的子串数量是 $ 2^n $ . 我们设每个到位置i, 答案的数量为f[i]. 然后我们考虑重复的, 我们发现, 每加入 ...

  5. CF CROC 2016 Intellectual Inquiry

    题目链接:http://codeforces.com/contest/655/problem/E 大意是Bessie只会英文字母表中的前k种字母,现在有一个长度为m+n的字母序列,Bessie已经知道 ...

  6. codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序

    题目链接 我们可以发现, 这是一个很明显的二分+拓扑排序.... 如何判断根据当前的点, 是否能构造出来一个唯一的拓扑序列呢. 如果有的点没有出现, 那么一定不满足. 如果在加进队列的时候, 同时加了 ...

  7. CodeForces - 645 C.Enduring Exodus

    快乐二分 用前缀和随便搞一下 #include <cstdio> using namespace std; ; int p[N]; ; inline int msum(int a, int ...

  8. 「CF645E」 Intellectual Inquiry

    题目链接 CF645E 题意 有一个长为\(n\)的由小写字母组成的字符串,需要用小写字母再填\(m\)位,使最后的字符串中本质不同的子串数量尽量多,答案对\(10^9+7\)取模. 本题数据:\(n ...

  9. 05.24 ICPC 2019-2020 North-Western Russia Regional Contest复现赛+Codeforces Round #645 (Div. 2)

    A.Accurate Movement(复现赛) 题意:两个木块最左边都在0的位置,最右边分别为a,b(b>a),并且短的木条只能在长木条内移动,问两个木条需要移动多少次才能使两个木条的右端都在 ...

随机推荐

  1. 关于ajax请求返回类型问题

    昨天遇到一个问题,是关于请求到的json数据没有正确渲染,打开谷歌调试器里面的network中的response,看到的是正常返回的json数据,打开json.cn,复制返回的数据,也能正常解析,但是 ...

  2. Ruby中字符串与正则表达式的问题

    Ruby的正则表达式为Regexp类的对象 主要的元语言字符 記号 意味 例 説明 ^ 行頭 /^abc/ abcで始まる行 $ 行末 /abc$/ abcで終わる行 . 任意の1文字 /a.b/ a ...

  3. 细节小bug

    1. function devChange(value){ $("#multipleLeft").empty(); ReportRemote.getDeviceFlow(value ...

  4. 玩玩cordova(MAC安装环境)

    PhoneGap/cordova为代表的基于HTML5开发iOS/Android应用的技术,大大降低了手机App的开发门槛.虽然目前与原生的Object-C/Java开发的应用在性能上还有差距,但是对 ...

  5. PP生产订单创建、下达、报工、收货、投料

    转自http://blog.sina.com.cn/s/blog_69fb8eb60102vpjd.html SAP 物料订单创建.下达.报工.收货与投料(ABAP代码) (2015-06-03 22 ...

  6. python3 如何使用ip、爬虫

    使用urllib.request.random模块,不说了贴代码 url="*"; iplist=['70.254.226.206:8080'];proxy_support=url ...

  7. javax.el.PropertyNotFoundException:

    javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...

  8. CSS3+JS切割轮播图

    以下说明数据,是指有4张图片的轮播图,分别切割成4张. 首先,做成单张切换的立体效果,即通过旋转,确定四张图片的位置,分别是一个立方体的上下前后的图片翻转移动角度. .box ul li:nth-ch ...

  9. Postfix邮件服务器搭建及配置

    一.邮件服务器(Mail Server)的传输协议 1.简单邮件传输协议(SMTP):Simple Mail Transger Protocol 2.扩展的简单邮件传输协议(ESMTP):Extend ...

  10. js问题

    1.原型链问题 1.js中万物皆对象,但对象也分为普通对象和函数对象,Object,Function都是js自带的函数对象,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普 ...