类型:概率 + 解方程组(高斯消元法) + KMP(好吧其实我用的是暴力~)
题意:你可以等概率的选择大写字母里的前n个字母,在纸上写啊写,一直到出现给定的字符串。问写的字母个数的期望。
思路:

期望递推法。(不过这里推出了个环……)
下一个状态是看现在这个串,加上一个字母之后,能匹配到原串的哪里。(就是KMP里面的失配数组,写字符串的过程,就是一边写一边匹配)
不过我KMP不太熟悉,就直接暴力了。。
推完后发现,推出了一个环。怎么办,只能用高斯消元法来解这个方程组了。
这题比较特殊,经过证明(我不会= =)可以得到,答案必定为整数。
高斯消元法用double精度卡死(样例都过不了),用分数还是WA(可能溢出了),最后纯用long long 终于过了它。。。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; char str[];
char tmpstr[]; long long matrix[][]; int check() {
int res = ;
for (int i = ; tmpstr[i]; i++) {
bool ok = true;
for (int j = ; tmpstr[j+i]; j++) {
if (str[j] != tmpstr[j+i]) {
ok = false;
break;
}
}
if (ok) {
res = strlen(tmpstr) - i;
break;
}
}
return res;
} bool gauss(int row, int col) {
for (int i = ; i < row; i++) {
int k = -;
for (int j = i; j < row; j++) {
if (matrix[j][i] != ) {
k = j;
break;
}
}
if (k == -) return false;
for (int j = ; j < col; j++) {
swap(matrix[i][j],matrix[k][j]);
}
if (matrix[i][i] < ) {
for (int j = ; j < col; j++) {
matrix[i][j] *= -;
}
}
for (int j = ; j < row; j++) {
if (j == i) continue;
if (matrix[j][i] == ) continue;
if (matrix[j][i] < ) {
for (int k = ; k < col; k++) {
matrix[j][k] *= -;
}
}
long long gcdnum = __gcd(matrix[i][i], matrix[j][i]);
long long lcanum = matrix[i][i]/gcdnum*matrix[j][i];
long long jmul = lcanum / matrix[j][i];
long long imul = lcanum / matrix[i][i];
for (int k = ; k < col; k++) {
matrix[j][k] = matrix[j][k]*jmul - matrix[i][k] * imul;
}
}
}
return true;
} void print(int len) {
puts("--------");
for (int i = ; i < len; i++) {
for (int j = ; j < len+; j++) {
printf("%lld ", matrix[i][j]);
}puts("");
}
} int main() {
int t;
scanf("%d", &t);
for (int cas = ; cas <= t; cas++) {
if (cas != ) puts("");
printf("Case %d:\n", cas); int n;
scanf("%d%s", &n, str);
int len = strlen(str); //计算dp[0]~dp[len-1] len条方程
for (int i = ; i < len; i++) {
for (int j = ; j < len+; j++) matrix[i][j] = ;
matrix[i][i] = -n;
matrix[i][len] = -n;
sprintf(tmpstr, "%s", str);
tmpstr[i+] = ;
for (int j = ; j < n; j++) {
tmpstr[i] = 'A'+j;
if (check() != len) matrix[i][check()]++;
}
}
//print(len);
if (!gauss(len, len+)) puts("ERROR");
//print(len);
//printf("%lld(%lld/%lld)\n", matrix[0][len]/matrix[0][0], matrix[0][len], matrix[0][0]);
printf("%lld\n", matrix[][len]/matrix[][]);
}
return ;
}

ZOJ 2619: Generator的更多相关文章

  1. JavaScript异步编程:Generator与Async

    从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱. Promise是下边要讲的Generator/yield与async/await的基 ...

  2. ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...

  3. ES6 异步编程之一:Generator

    Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...

  4. ES6 - Note7:Generator函数

    Generator函数 1.Generator函数是ES6增加的异步编程解决方案之一,与普通的函数行为完全不同,类似于一个状态机,内部封装了多个状态. 在函数定义的形式上,跟普通函数差不多,有两处不同 ...

  5. Python:generator的send()方法流程分析

    先来一个简单地例子: def foo(): print('starting') while True: r = yield 2 print(r) f = foo() print(f.send(None ...

  6. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

  7. django1.11 启动错误:Generator expression must be parenthesized

    错误信息: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0 ...

  8. ES6入门十一:Generator生成器、async+await、Promisify

    生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...

  9. django 启动错误:Generator expression must be parenthesized 错误信息:

    错误为: Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x ...

随机推荐

  1. 【NOIP2017提高A组冲刺11.8】好文章

    #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> us ...

  2. strace用法

    strace   --  trace system calls and signals     strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信 ...

  3. 小试nginx日志分析xlog

    nginx配置: http { #...其他配置 log_format tpynormal '$remote_addr | [$time_local] | $host | "$request ...

  4. Python 建模步骤

    #%% #载入数据 .查看相关信息 import pandas as pd import numpy as np from sklearn.preprocessing import LabelEnco ...

  5. Huawei warns against 'Berlin Wall' in digital world

    From China Daily Huawei technologies criticized recent registration imposed on the Chinese tech comp ...

  6. leetcode-16-greedyAlgorithm

    455. Assign Cookies 解题思路: 先将两个数组按升序排序,然后从后往前遍历,当s[j] >= g[i]的时候,就把s[j]分给g[i],i,j都向前移动,count+1;否则向 ...

  7. Elasticsearch安装---安装jdk

    1.在Linux 上检查Java版本是否满足要求: java -version 如果运行上面命令时报错:-bash: java: command not found,首先检查是否有jdk ,要是有安装 ...

  8. HDU 5536 Chip Factory Trie

    题意: 给出\(n(3 \leq n \leq 1000)\)个数字,求\(max(s_i+s_j) \bigoplus s_k\),而且\(i,j,k\)互不相等. 分析: 把每个数字看成一个\(0 ...

  9. Android 标题栏(2)

    本文来自网易云社区 作者:孙圣翔 添加ActionProvider 1.在menu菜单中添加app:actionProviderClass属性: <item     android:id=&qu ...

  10. 记一次WMS的系统改造(3)— 行进中的复盘

    行进中的波折 革新总会面对一些阻力和风险,一种新的观念.一种新的模式要来替代既有的产品,从来都不是一件简单的事,在WMS改造这件事上我们一开始就提出两种概念货物驱动和任务驱动,并找到一个标杆产品Sla ...