类型:概率 + 解方程组(高斯消元法) + 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++ 学习笔记(三)string 类

    在C语言中如果想要使用字符串那么有两种方法: 1.定义char型数组:char[10]; 然后将每个字符填充到对应的位置. 优点:这种方式将字符串放在内存所以每个位置都可以修改. 缺点:赋值比较麻烦, ...

  2. Linux - which xxx - 查找执行的命令所在的路径

    Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? Linux 下有2个命令可完成该功能:which ,whereis which 用来查看当 ...

  3. html页面简单访问限制

    PS:突然发现博客园有密码保护功能,已经可以满足基本需求了.博客园还能备份自己的所有数据,做到了数据归用户所有,平台只是展示,真是良心网站,大赞. 想要通过一个站点放一些东西给一些人看,但是又不想让所 ...

  4. Vue基础指令集锦

    v-model双向绑定数据 <input type="text" v-model="msg"> {{msg}} ###v-on 事件 <div ...

  5. List<Object>删除某一个Object

    1.直接删除: List<LineShop> tlineprices  = new ArrayList<>(); tlineprices.remove(0); 2.使用遍历删除 ...

  6. JDK1.8 HashMap$TreeNode.rotateLeft 红黑树左旋

    红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) ...

  7. HDU:5040-Instrusive

    Instrusive Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Proble ...

  8. debian安装中文字体

    debian刚安装完成之后,因为没有中文字体,会出现方框. 安装中文字体: $ su # apt-get install fonts-arphic-bkai00mp fonts-arphic-bsmi ...

  9. git 强制回到以前版本

    git reset dfd3e36a641340a0b86f811df869c4375fabeff2 --hard

  10. luogu4016 负载平衡问题

    网络流不用动脑子的好爽啊 #include <iostream> #include <cstring> #include <cstdio> #include < ...