【Foreign】字串变化 [DP]
字串变化
Time Limit: 10 Sec Memory Limit: 128 MB
Description
定义一个(大写字母)字符串集合{S},初始时值包含一个给定的字符串S1,每次从中任意取出一个字符串,将它变换后再放入集合中。要求新的字符串在集合中没有出现过。
变换的规则:在变化前、后,字符串均有大写字母组成,每次只改动一个位置,使它的ASCLL加1。例如:‘A’ –> ‘B’。如果位置为‘Z’,则无法改动。
若干次操作后,该集合的元素个数一定会达到最大。
对最后的集合(已按字典序排列)中的Si(i >1),定义Sj=P[Si](Si由Sj变化而来)。
求最大元素个数及{P}的方案数。(详情见样例。)
Input
第1行有1个由大写字母组成的字符串。
Output
输出2行,每行包含一个数,第一行表示最大元素个数,第二行表示方案数,答案都模10007。
Sample Input
XYZ
Sample Output
6
4
explain:
最终集合为{XYZ,XZZ,YYZ,YZZ,ZYZ,ZZZ}
{P}方案有{0,1,1,2,3,4},{0,1,1,3,3,4},{0,1,1,2,3,5},{0,1,1,3,3,5}
HINT
初始字符串长度<=1000.
Solution
第一问乘一下就好了,这里讨论一下第二问。
用'Z'-ai得到一个数字串,那么操作就变成了:每次将一个数字-1,最后全部减成0。比如'XYZ',我们将其变成'012'。
然后考虑状态是怎么变来的:
显然,有几位是不满的,就有几种转移来的方法(其中任意一位数字+1,即可得到一种父状态)。
记一个状态可以由k个状态转移过来,然后答案显然就是:πk。
我们考虑,
我们得到一个长度为n的01串vis,如果这一位是1表示这一位不满。
那么这个01串对答案的贡献就是:k ^ (π [vis_i=1]*a_i)。(k表示1的个数)
为什么呢?对于一个位置,当这一位是[0,ai-1]都是不满的,个数就是ai。
然后这样枚举每一位是否满,可以做到O(2^n)。
我们考虑优化:
把k相同的放在一起计算,记贡献为k^num[k]。num[k]即是各种1的个数为k情况的指数之和。
num怎么得到呢?
用f[i][j]表示到了第i位,有j个数不满的方案数,显然可以得到这样的递推式子:
f[i][j] = f[i-1][j] + f[i-1][j-1] * ('Z'-a[i])
然后Ans = π k^f[n][k],就解决了这题qwq。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<bitset>
using namespace std;
typedef long long s64; const int ONE = ;
const int MOD = ; int n;
int a[ONE];
char ch[ONE];
int f[ONE][ONE];
int Ans; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} int Quickpow(int a, int b)
{
int res = ;
while(b)
{
if(b & ) res = (s64)res * a % MOD;
a = (s64)a * a % MOD;
b >>= ;
}
return res;
} int main()
{
scanf("%s", ch + );
n = strlen(ch + ); for(int i=; i<=n; i++)
a[i] = 'Z' - ch[i]; Ans = ;
for(int i=; i<=n; i++)
Ans = (s64)Ans * (a[i]+) % MOD;
printf("%d\n", Ans); Ans = ; f[][] = ;
for(int i=; i<=n; i++)
{
f[i][] = ;
for(int j=; j<=i; j++)
f[i][j] = (f[i-][j] + f[i-][j-] * a[i] % (MOD - )) % (MOD - );
} for(int k=; k<=n; k++)
Ans = (s64)Ans * Quickpow(k, f[n][k]) % MOD; printf("%d", Ans);
}
【Foreign】字串变化 [DP]的更多相关文章
- P1279 字串距离 dp 洛谷
题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...
- 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- [luoguP2031] 脑力达人之分割字串(DP)
传送门 想了个4次方算法,没想到也A了,数据真是水. 其实两个字符串匹配那部分可以用kmp优化 ——代码 #include <cstdio> #include <cstring> ...
- 洛谷 P1032 【字串变换】
感觉这个题用一些常用的stl和string函数会非常简单..(难道就是考这两个的吗? vector<pair<string,string>>pos//用于变化 map<s ...
- P2031 脑力达人之分割字串
P2031 脑力达人之分割字串字符串dp,f[i]表示主串到第i个字符,最多能分割成多少子串.f[i]=max(f[i],f[k]+1);k是能匹配到的前一位. #include<iostrea ...
- 【NOIP2015】字串
[NOIP2015]字串 标签: DP NOIP Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其 ...
- P1279 字串距离
P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...
- SPOJ - NSUBSTR(长度为1-len的字串出现的最大次数
题意:给你一个字符串,要你输出1-len的字串出现的最大次数. /** @xigua */ #include <stdio.h> #include <cmath> #inclu ...
- (字符串)最长公共字串(Longest-Common-SubString,LCS)
题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路与代码: 1.简 ...
随机推荐
- springboot 整合apache shiro
这几天因为项目需要,学习了下shiro,由此留下一些记录,也希望对初学shiro的朋友有帮助. springboot 是这两年新兴起来的一个项目,它的出现是为了减少springmvc开发过程中需要引入 ...
- ejabberd学习2
1.ejabberd监听多个端口 每个网络连接进来,ejabberd都会使用一个进程来负责这个连接的数据处理.原理跟Joe Armstrong的<Erlang程序设计>中的并行服务器一样, ...
- css那些事儿4 背景图像
background:背景颜色,图像,平铺方式,大小,位置 能够显示背景区域即为盒子模型的填充和内容部分,其中背景图像将会覆盖背景颜色.常见的水平或垂直渐变颜色背景通常使用水平或垂直渐变的背景图像在水 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-3
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 依靠HTML 逻辑框架等技术完成程序界面前端的实现. 明天计划完成的工作: 依靠css 逻辑框架等技术完成程序界面前端的实现. 工作中遇到的 ...
- 优化mysql的内存
Mysql占用CPU过高的时候,该从哪些方面下手进行优化? 占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processl ...
- 【Python】关于Python里面小数点精度控制的问题
基础 浮点数是用机器上浮点数的本机双精度(64 bit)表示的.提供大约17位的精度和范围从-308到308的指数.和C语言里面的double类型相同.Python不支持32bit的单精度浮点数.如果 ...
- Matlab中fspecial的用法【转】
Fspecial函数用于创建预定义的滤波算子,其语法格式为:h = fspecial(type)h = fspecial(type,parameters,sigma) 参数type制定算子类型,par ...
- RT-thread内核之小内存管理算法
一.动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配 ...
- poj1065-Wooden Sticks
题目 有很多小木棍需要机器处理.每个小木棍有重量和长度两个属性.不断把小木棍放入机器中,如果小木棍\(a\)放完后放入小木棍\(b\),那么如果\(a.weight<=b.weight\ and ...
- 【bzoj5108】[CodePlus2017]可做题 拆位+乱搞
题目描述 给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定.现在令 $b$ 表示 $a$ 的前缀异或和,求 $ ...