字串变化

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
  我们考虑,
  我们得到一个长度为n01串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]的更多相关文章

  1. P1279 字串距离 dp 洛谷

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  2. 最长公共子序列与最长公共字串 (dp)转载http://blog.csdn.net/u012102306/article/details/53184446

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  3. [luoguP2031] 脑力达人之分割字串(DP)

    传送门 想了个4次方算法,没想到也A了,数据真是水. 其实两个字符串匹配那部分可以用kmp优化 ——代码 #include <cstdio> #include <cstring> ...

  4. 洛谷 P1032 【字串变换】

    感觉这个题用一些常用的stl和string函数会非常简单..(难道就是考这两个的吗? vector<pair<string,string>>pos//用于变化 map<s ...

  5. P2031 脑力达人之分割字串

    P2031 脑力达人之分割字串字符串dp,f[i]表示主串到第i个字符,最多能分割成多少子串.f[i]=max(f[i],f[k]+1);k是能匹配到的前一位. #include<iostrea ...

  6. 【NOIP2015】字串

    [NOIP2015]字串 标签: DP NOIP Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其 ...

  7. P1279 字串距离

    P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...

  8. SPOJ - NSUBSTR(长度为1-len的字串出现的最大次数

    题意:给你一个字符串,要你输出1-len的字串出现的最大次数. /** @xigua */ #include <stdio.h> #include <cmath> #inclu ...

  9. (字符串)最长公共字串(Longest-Common-SubString,LCS)

    题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路与代码: 1.简 ...

随机推荐

  1. ACM 第十四天

    字符串: 1.KMP算法(模式串达到1e6) 模式串达到1e4直接暴力即可. 字符串哈希 字符串Hash的种类还是有很多种的,不过在信息学竞赛中只会用到一种名为“BKDR Hash”的字符串Hash算 ...

  2. 【OpenGL】无法启动此程序,因为计算机中丢失 glut32.dll。尝试重新安装该程序以解决此问题。

    运行OpenGL程序的时候报错,如图: 解决方法:把glut32.dll复制到C:\Windows\SysWOW64目录下,而不是像网上教程那样复制到C:\Windows\System32目录下. 原 ...

  3. PokeCats开发者日志(十二)

      现在是PokeCats游戏开发的第六十一天的晚上,终于拿到软著权登记证书了!   看来易版权确实是个值得信赖的代办机构呢,400块花的不冤.

  4. 修改IntelliJ IDEA代码头注释

  5. MD5加密的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. [C/C++] 大小端存储问题

    首先来看一下今天做的一道题: 解析: union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据 ...

  7. 【python】Python 之 __new__() 方法与实例化

    本文转自:http://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 ...

  8. (一)Redis简介及安装

    Redis简介 Redis 是一个开源(BSD许可)的,内存中的key-value数据结构存储系统,它可以用作数据库.缓存和消息中间件. Redis具有丰富的数据结构类型.包括字符串(string), ...

  9. hadoop 使用map合并小文件到SequenceFile

    上一例是直接用SequenceFile的createWriter来实现,本例采用mapreduce的方式. 1.把小文件整体读入需要自定义InputFormat格式,自定义InputFormat格式需 ...

  10. 【题解】SCOI2007组队

    恩……为什么大家都这么执着于 \(O(n^{2})\) 的复杂度捏?如果接受 \(O(n^{2} + nV)\) 的复杂度,那这题可不是道**题吗( • ̀ω•́ )✧ 首先把所有的人按照身高排个序, ...