Codeforces 645E Intellectual Inquiry (dp不同子序列计数)

来源:互联网 发布:酒店美工是做些什么 编辑:程序博客网 时间:2024/05/19 07:09
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>#include <vector>using namespace std;#define N 2000030#define M 15000030#define mod 1000000007char s[N];int n, k;int pre[26];int f[N];int main() {scanf("%d%d", &n, &k);scanf("%s", s + 1);memset(pre, -1, sizeof pre);f[0] = 1;for(int i = 1; s[i]; ++i) {f[i] = 1;int c = s[i] - 'a';pre[c] = i;for(int j = 0; j < k; ++j) {if(pre[j] == -1) continue;f[i] += f[pre[j]-1];if(f[i] >= mod) f[i] -= mod;}}int m = strlen(s + 1);for(int i = m + 1; i <= m + n; ++i) {int mi = -1;f[i] = 1;for(int j = 0; j < k; ++j) {if(mi == -1 || pre[j] == -1 || pre[j] < pre[mi]) {mi = j;}}int c = mi;pre[c] = i;for(int j = 0; j < k; ++j) {if(pre[j] == -1) continue;f[i] += f[pre[j]-1];if(f[i] >= mod) f[i] -= mod;}}printf("%d\n", f[n+m]);return 0;}

0 0
原创粉丝点击