codeforces 645 E. Intellectual Inquiry
一个字符串,由前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的更多相关文章
- Codeforces 645E. Intellectual Inquiry(DP,贪心)
Codeforces 645E. Intellectual Inquiry 题意:给定一串字符,由前k个小写拉丁字母组成,要求在该字符串后面补上n个字符(也从前k个小写拉丁字母里面选),使得最后得到的 ...
- 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 ...
- CROC 2016 - Elimination Round (Rated Unofficial Edition) E - Intellectual Inquiry dp
E - Intellectual Inquiry 思路:我自己YY了一个算本质不同子序列的方法, 发现和网上都不一样. 我们从每个点出发向其后面第一个a, b, c, d ...连一条边,那么总的不同 ...
- codeforces 645E . Intellectual Inquiry
题目链接 如果不考虑重复的元素, 那么我们可以很容易的发现, 长度为n的字符串它的子串数量是 $ 2^n $ . 我们设每个到位置i, 答案的数量为f[i]. 然后我们考虑重复的, 我们发现, 每加入 ...
- CF CROC 2016 Intellectual Inquiry
题目链接:http://codeforces.com/contest/655/problem/E 大意是Bessie只会英文字母表中的前k种字母,现在有一个长度为m+n的字母序列,Bessie已经知道 ...
- codeforces 645 D. Robot Rapping Results Report 二分+拓扑排序
题目链接 我们可以发现, 这是一个很明显的二分+拓扑排序.... 如何判断根据当前的点, 是否能构造出来一个唯一的拓扑序列呢. 如果有的点没有出现, 那么一定不满足. 如果在加进队列的时候, 同时加了 ...
- CodeForces - 645 C.Enduring Exodus
快乐二分 用前缀和随便搞一下 #include <cstdio> using namespace std; ; int p[N]; ; inline int msum(int a, int ...
- 「CF645E」 Intellectual Inquiry
题目链接 CF645E 题意 有一个长为\(n\)的由小写字母组成的字符串,需要用小写字母再填\(m\)位,使最后的字符串中本质不同的子串数量尽量多,答案对\(10^9+7\)取模. 本题数据:\(n ...
- 05.24 ICPC 2019-2020 North-Western Russia Regional Contest复现赛+Codeforces Round #645 (Div. 2)
A.Accurate Movement(复现赛) 题意:两个木块最左边都在0的位置,最右边分别为a,b(b>a),并且短的木条只能在长木条内移动,问两个木条需要移动多少次才能使两个木条的右端都在 ...
随机推荐
- Linux内核分析——分析system_call中断处理过程
万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我选择的是get ...
- oracle行转列,decode 等用法
DECODE()函数,它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式.当然,如果未能与任何一个实参序偶匹配成功,则函数也有默 ...
- 前端一:走进HTML
一:HTML(HyperText Markup Language)介绍 超文本标记语言,标准通用标记语言下的一个应用.“超文本”就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素.超文本标记语 ...
- i5 6300HQ 和 i7 6700HQ
i7 6700HQ: 四核八线程 14nm 45W 2.6-3.5GHz 支持DDR4 2133内存 三级缓存6M HD Graphics 530集显 i5 6300HQ: 四核四线程 14nm 45 ...
- (实用篇)php支付宝接口用法分析
本文实例讲述了php支付宝接口用法.分享给大家供大家参考.具体分析如下: 现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来, ...
- dede currentstyle属性完美解决方案
问题一.dede让channelartlist标签支持currentstyle属性 完美解决 打开include\taglib\channelartlist.lib.php找到$pv->Fiel ...
- javascript学习笔记全记录
js的初步了解 1.就是用来修改样式的,修改的是行内样式.任何样式都能够修改. 2.css里面怎么写js就怎么写. 3.任何元素都能加事件:事件都要小写 js的三大 ...
- java程序链接到sql server数据库
package jianhua; import java.sql.*; public class ConDatabase { public static void main(String[] args ...
- Scrolliview
package com.example.scrollview; import android.os.Bundle;import android.app.Activity;import android. ...
- Oracle 数据库SQL性能查看
作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...