类型:概率 + 解方程组(高斯消元法) + 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. C++ 学习笔记(五)类的知识小结一(重载,友元函数,静态成员,new)

    ---恢复内容开始--- 学习C++类知识点还是挺多的,每个知识点学习的时候都觉得这个知识点咋那么多东西,其实真学完了再回头看好像也就那么点.这次用程序写一个黑猫揍白猫的故事总结一下这段时间学习的零碎 ...

  2. shell 练习 - 第七周

    1. 用shell实现传入进程pid, 查看对应进程/proc下CPU.内存指标 #!/bin/bash read -p "Input PID Value: " pid pid_e ...

  3. HTTP-常用配置

    前言 这篇主要介绍HTTP服务程序环境 可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进 HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1 ...

  4. paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之全0/1/z/x的SV写法

  5. LeetCode(44) Wildcard Matching

    题目 Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single characte ...

  6. sublime text3 安装ctags实现函数跟踪跳转

    来源:http://blog.csdn.net/menglongfc/article/details/51141084 本人试用平台如下:sublime text3,和谐版 在source insig ...

  7. 2018 Multi-University Training Contest 10 CSGO(HDU - 6435)(最远曼哈顿距离)

    有 n 种主武器,m 种副武器.每种武器有一个基础分数k种属性值 X[i] . 选出一种主武器 mw 和一种副武器 sw,使得两种武器的分数和 + 每个属性的差值尽量大.(参考下面的式子) 多维的最远 ...

  8. 原生Ajax+springBoot实现用户登录

    思路:用户输入登录信息——信息传到后台——数据库查询——比较查询结果——返回登录信息(成功/失败) html页面代码: <!DOCTYPE html> <html lang=&quo ...

  9. python基础学习笔记——类的约束

    ⾸先, 你要清楚. 约束是对类的约束. 用一个例子说话: 公司让小明给他们的网站完善一个支付功能,小明写了两个类,如下: class QQpay: def pay(self,money): print ...

  10. MacOS常用软件推荐

    1.效率提升神器Alfred 可以搜索文件.应用.web搜索.词典等等 链接:https://pan.baidu.com/s/1igv4tuXkuMFOPT9E6Cc5Jg 密码:3o51 软件解压密 ...