Codeforces #349 div1 C. Codeword 组合数学 递推

8人阅读 评论(0) 收藏 举报
分类:

题解

首先需要看出方案数只和模式串的长度有关,和具体的字符无关。

由于模式串的长度和规模为105105,则不同长度模式串最多有105105种,因而如果如果我们若能在线性时间内推出某长度下的结果,复杂就会变成Θ(nn)Θ(nn)

具体记数的过程比较复杂,需要考虑枚举模式串为第一次匹配的情况。

SS为主串,模式串为PPaiai|S|=i|S|=i时的方案数。

ai={026ai1+(n1i1)25i|P| if i<|P| if i|P|ai={0 if i<|P|26ai−1+(n−1i−1)⋅25i−|P| if i⩾|P|

26ai126ai−1包含了第一次匹配在S1Si1S1⋯Si−1出现的情况,最后一个位置放啥都行。

(n1i1)25i|P|(n−1i−1)⋅25i−|P| 是在SiSi才出现第一次匹配的情况。S1Si1S1⋯Si−1能匹配PiP|P|1Pi⋯P|P|−1Si=P|P|Si=P|P|。最后一位确定,然后在S1Si1S1⋯Si−1选择PiP|P|1Pi⋯P|P|−1的匹配,即(n1i1)(n−1i−1),剩余的位置每个位置都含有2525种可能,因为不能是它之后第一个确定的位置的字符。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
// head
const int N = 1e5+5;
const int MOD = 1e9+7;

LL powmod(LL a, LL b) {
    LL ans = 1;
    for (; b; b >>= 1) {
        if (b & 1) ans = (a * ans) % MOD;
        a = a * a % MOD;
    }
    return ans;
}

int fac[N], inv[N], p25[N];

void init() {
    inv[0] = fac[0] = p25[0] = 1;
    for (int i = 1; i < N; i++) {
        fac[i] = (LL)fac[i-1] * i % MOD;
        inv[i] = powmod(fac[i], MOD-2);
        p25[i] = (LL)p25[i-1] * 25 % MOD;
    }
}

LL C(int n, int m) {
    return (LL)fac[n] * inv[m] % MOD * inv[n-m] % MOD;
}

int a[N], ans[N];
vector<PII> query[N];

void solve(int n) {
    a[n] = 1;
    for (int i = 0; i < n; i++) {
        a[i] = 0;
    }
    for (int i = n+1; i < N; i++) {
        a[i] = (LL)a[i-1] * 26 % MOD;
        a[i] = (a[i] + C(i-1, n-1) * p25[i-n]) % MOD;
    }
    for (auto q : query[n]) {
        ans[q.fi] = a[q.se];
    }
}

char s[N];

int main() {
    init();
    int n, cur, q, x, cnt = 0;
    scanf("%d", &n);
    scanf("%s", s);
    cur = strlen(s);
    for (int i = 0; i < n; i++) {
        scanf("%d", &q);
        if (q == 1) {
            scanf("%s", s);
            cur = strlen(s);
        } else {
            scanf("%d", &x);
            query[cur].push_back(make_pair(cnt++, x));
        }
    }
    for (int i = 0; i < N; i++) {
        if (query[i].size() == 0) continue;
        solve(i);
    }
    for (int i = 0; i < cnt; i++) {
        printf("%d\n", ans[i]);
    }
    return 0;
}



查看评论

人工智能工程师直通车第一期

-
  • 1970年01月01日 08:00

Codeforces 666C C. Codeword 组合数学+DP

C. Codeword time limit per test 6 seconds memory limit per test 256 megabytes input...
  • sinat_35406909
  • sinat_35406909
  • 2017-11-18 14:47:06
  • 107

Codeforces Round #459 (Div. 2) C. The Monster

题目链接 C. The Monster time limit per test 1 second memory limit per test 256 megabytes input s...
  • ffgcc
  • ffgcc
  • 2018-01-30 09:48:19
  • 106

codeforces #334 div1 603C Lieges of Legendre(博弈)

题目链接:codeforces 603C题目大意:有两个人做游戏,游戏规则如下: 有n堆石子,每次可以对一堆石子进行操作,如果当前石子是偶数,那么可以选择将这2*x个石子分成k堆石子数为x的石子堆,...
  • qq_24451605
  • qq_24451605
  • 2015-12-03 00:15:27
  • 1939

codeforces 294C C. Shaass and Lights(组合数学)

题目链接:codeforces题目大意:给出一列灯,初始有一些点亮的灯,每次只能点亮与已经点亮的灯相邻的灯,问点亮所有灯的方案有多少种。题目分析: 首先利用初始已经点亮的灯分段,最左侧和最右侧的两段因...
  • qq_24451605
  • qq_24451605
  • 2015-08-23 10:45:53
  • 814

Shaass and Painter Robot : CodeForces294D

题目 Shaass and Painter Robot : CodeForces294D题意给你一张N*M(2 ≤ n, m ≤ 10^5)的矩形图和一个机器人。机器人一开始位于(x0,y0),它只能...
  • fearlessxjdx
  • fearlessxjdx
  • 2017-06-29 20:45:57
  • 162

CodeForces 294 C.Shaass and Lights(组合数学)

Description给出一排灯,用0101表示灯的开关状态,00表示灯关,11表示灯亮,每次可以打开之前是关闭状态的且其旁边有打开状态灯的灯,问有多少种方案可以把所有灯打开Input第一行两个整数n...
  • V5ZSQ
  • V5ZSQ
  • 2018-01-04 14:23:46
  • 147

codeforces914C Travelling Salesman and Special Numbers 二进制特性+组合数学+递推

比较骚的一道题。。 题意大概是,我们定义一次操作&#x03B1;" role="presentation" style="position: relative;">αα\alpha:将一个数i" r...
  • LiRewriter
  • LiRewriter
  • 2018-01-30 23:10:29
  • 150

CodeForces 294C - Shaass and Lights 统计

对于样例3:   1 2 3 4 5 6 7 8 9 10 11            有9个灯要打开...首先处理4前面的...放到9个要打开的任意位置C(9,3)..并且前面几个只有一种操作顺序...
  • kk303
  • kk303
  • 2013-07-25 14:21:20
  • 1228

TopCoder SRM604 DIV1 250

题目大意:外星人想吃汉堡。每一个汉堡有两种属性typei与tastei。他获得的快乐值为Y*A,其中Y为他吃的汉堡中有多少种不同类型汉堡,A为他吃到的汉堡tastei之和。...
  • Fragile_azalea
  • Fragile_azalea
  • 2016-03-18 14:33:21
  • 246
    个人资料
    等级:
    访问量: 1万+
    积分: 585
    排名: 8万+
    文章存档
    最新评论