E - Intellectual Inquiry

思路:我自己YY了一个算本质不同子序列的方法, 发现和网上都不一样。

我们从每个点出发向其后面第一个a, b, c, d ...连一条边,那么总的不同子序列就是从0号点出发能走出多少条

不同点的路径。 dp[ i ]表示是到 i 这个点的不同路径数, 构成的图显然是个DAG,把这个dp出来就好啦。最后补

n个就是贪贪心。

网上的另外两种方法。

dp[ i ] 表示[1, i] 的字符串有多少不同子序列。

dp[ i ] = dp[i - 1] * 2 - dp[ pre[s[ i ] ] - 1]

dp[ i ][ j ]表示[1, i] 的字符串末尾为 j 的不同子序列有多少种。

如果s[ i ] != j     dp[ i ][ j ] = dp[ i - 1] [ j ]

否则  dp[ i ] [ j ] = (dp[ i - 1][ 0 ] + dp[ i - 1][ 1 ].... + dp[ i - 1][ k - 1]) + 1

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define PLI pair<LL, int>
#define ull unsigned long long
using namespace std; const int N = 2e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n, m, k, pr[];
char s[N]; inline void add(int &a, int b) {
a += b; if(a >= mod) a -= mod;
} struct Bit {
int a[N];
void modify(int x, int v) {
for(int i = x; i < N; i+=i&-i)
add(a[i], v);
}
int sum(int x) {
int ans = ;
for(int i = x; i; i-=i&-i)
add(ans, a[i]);
return ans;
}
int query(int l, int r) {
if(!l) return (sum(r)+mod+)%mod;
return (sum(r)-sum(l-)+mod)%mod;
}
} bit; void extend(int x, int c) {
int pos = s[x-]-'a' == c ? x- : pr[c];
int val = bit.query(pos, x-);
bit.modify(x, val);
if(x > ) pr[s[x-]-'a'] = x-;
} int main() {
scanf("%d%d", &n, &k);
scanf("%s", s + );
m = strlen(s + );
for(int i = ; i <= m; i++)
extend(i, s[i]-'a');
for(int i = m+; i <= m+n; i++) {
int z = -;
for(int j = ; j < k; j++) {
if(j != s[i-] - 'a') {
if(z == - || pr[z] > pr[j]) z = j;
}
}
if(z == -) z = ;
s[i] = 'a' + z;
extend(i, z);
}
printf("%d\n", bit.query(, n + m));
return ;
} /*
*/

最新文章

  1. 图解CSS3制作圆环形进度条的实例教程
  2. 【高级功能】使用 Ajax(续)
  3. http状态码全解
  4. 大型网站SEO优化策略框架
  5. HDU1102--最小生成树
  6. MySQL中无GROUP BY直接HAVING的问题【转】
  7. 抽象类和抽象方法(关键字abstract)
  8. BZOJ4340 : BJOI2015 隐身术
  9. ajax状态码
  10. 理解MFC 文档、视图、框架[转]
  11. QT窗口渐现效果,窗口震动效果,鼠标移动窗口
  12. 关于Struts框架简介
  13. Jekyll搭建过程详解
  14. 越狱开发-创建真正的后台程序(Daemon Process)
  15. BDD框架:behave学习记录
  16. 【持续更新】.Net 开发中给自己埋下的坑!
  17. Linux 文本处理工具(grep sed awk )
  18. WebView 判断放大缩小操作
  19. 4.8cf自训
  20. prometheus热重启

热门文章

  1. Linux初学之vmware Workstation 网络连接三种模式
  2. Tomcat——Tomcat使用详解
  3. NOIP2012 提高组 Day 1
  4. 判断android是否是debug
  5. 小记 百度地图 soso地图 经纬度偏移
  6. [gym100956]Problem J. Sort It! BIT+组合数
  7. 51nod 小Z的trie(Trie+广义SAM)
  8. Oracle错误: ORA-01722 无效数字
  9. 58、synchronized同步方法
  10. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)