题目大意:
  有一串n个字母,每个位置的字母可以同化边上的一个字母,
  比如:ab可以变成aa或者bb。
  相对的两个同化不能同时发生,比如ab不能变成ba。
  现在给你一个字符串,问你经过任意次数的同化过程,最多能生成多少个字符串。

思路:
  考虑同化过后的字符串与同化前的字符串的关系。
  如果我们把一个字符串中相邻且相同的字母缩在一起,那么我们可以发现每一次同化就相当于从原串中去掉了一个字符。
  这也就意味着同化过后的串一定是原串的一个子序列。
  同样,如果一个串是原串的一个子序列,它一定能由原串同化而来。
  我们可以先统计一下原串不同长度子序列的个数。
  对于一个长度为l的子序列,它里面有n-l个字符被缩过,那么缩之前的串总共有C(n,l)种可能。
  不同的子序列数量可以用DP求出来。
  f[i][j]表示以字符j结尾的长度为i的子序列数量,则f[i][j]=sum{f[i-1][k]|k≠j}+1,枚举i,j,k,时间复杂度O(n^2*26)。
  如果直接枚举k会TLE,只能过11个点,我们可以考虑用sum[i]记录长度为i的子串的数量和。
  由于结尾位置的字符已确定,所以组合数用C(n-1,l-1)算,时间复杂度O(n^2)。

 #include<cstdio>
#include<cctype>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,SIGMA=,mod=1e9+;
char s[N];
int f[N][SIGMA],sum[N],fact[N],factinv[N];
inline int idx(const char &ch) {
return ch-'a'+;
}
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=;
y=;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int &x) {
int ret,tmp;
exgcd(x,mod,ret,tmp);
return (ret%mod+mod)%mod;
}
inline int C(const int &n,const int &m) {
return (int64)fact[n]*factinv[n-m]%mod*factinv[m]%mod;
}
int main() {
const int n=getint();
scanf("%s",s);
fact[]=factinv[]=;
for(register int i=;i<n;i++) {
fact[i]=(int64)fact[i-]*i%mod;
factinv[i]=inv(fact[i]);
}
sum[]=;
for(register int i=;i<n;i++) {
const int ch=idx(s[i]);
for(register int i=;i<=n;i++) {
sum[i]=(sum[i]-f[i][ch]+mod)%mod;
f[i][ch]=(sum[i-]-f[i-][ch]+mod)%mod;
sum[i]=(sum[i]+f[i][ch])%mod;
}
}
int ans=;
for(register int i=;i<=n;i++) {
ans=(ans+(int64)C(n-,i-)*sum[i]%mod)%mod;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. 使用plsql创建表空间和用户
  2. 基于Spring Mvc实现的Excel文件上传下载
  3. 4、JavaScript
  4. rails: 的cookie小结
  5. [转]理解HTTP幂等性
  6. 《30天自制操作系统》笔记(03)——使用Vmware
  7. 学习通过Thread+Handler实现非UI线程更新UI组件
  8. MYSQL C API : struct MYSQL_STMT 结构的组合使用
  9. JQuery快速入门
  10. 10张思维导图带你学习JavaScript
  11. 【html】【0】开始的序言
  12. ASP图片格式与base64数据互转方法
  13. std::list.pop_back() 弹空了列表导致的崩溃
  14. 【java】Freemarker 动态生成word(带图片表格)
  15. 4.DOM
  16. SQL Server-聚焦事务、隔离级别详解(二十九)
  17. 利用api模拟百度搜索功能
  18. js的各种验证
  19. 阿里大于发送短信(java)
  20. Python模块:time模块详解(转)

热门文章

  1. Python代码这样写更优雅(转)
  2. java===字符串常用API介绍(转)
  3. python实战===老司机奇技淫巧系列之字符转换成图片
  4. python基础===修改属性的值
  5. OWASP SSL 高级审查工具
  6. Web开发中,页面渲染方案
  7. jq监听ajax执行开始,出错,结束。
  8. leetcode 之Rotate Image(8)
  9. hive学习(一)hive架构及hive3.1.1三种方式部署安装
  10. 微信小程序实战篇-图片的预览、二维码的识别