第一弾が始まる!

定期更新しない!

来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5XXoERDanUcdxw08SmRj1a5VY1o7jpW1xYv_V1kuYao1Pg4yKdfG4MfNsNAEa

codechef problems 第一弹

一.Authentication Failed
原题题面
Several days ago Chef decided to register at one of the

programming sites. For registering he was asked to choose a

nickname and a password. There was no problem with choosing a

nickname ("Chef" is his favorite nickname), but choosing a

password in a secure way seemed to be a real problem for Chef.

Therefore, he decided to write a program which would generate

the password of length N consisting of small Latin letters a..z.

Then Chef successfully registered at the site and saved the

password in a file (as it was too hard to remember).

Today Chef decided to visit the site once again. He entered his

nickname, copied the password from the file... "Authentication

failed!" was the answer. Trying to understand the reason of

this, he noticed that the password in his file had length N+K

instead of N! Sure enough of the source of the problem, Chef

went straight to his young brother.

And Chef was right, it was his brother who had inserted K random

small Latin letters at some random positions (possibly at the

beginning or at the end) of the password. Chef's brother didn't

remember what exactly changes he had made at all, but he

promised that he had done nothing besides inserting letters.

As there is no other way to recover the password, Chef is now

starting to remove every possible combination of K letters from

the password trying to enter (when Chef obtains the same

password as one of the previously entered passwords, he doesn't

try to enter using this password again). Now the question is:

what is the number of times Chef will receive "Authentication

failed!" as the answer before successful entering in the worst

case? As the answer might be quite large, output its remainder

of division by 1009419529.

Input

The first line of the input file contains one integer T -- the

number of test cases (no more than 10). Each test case is

described by a line containing two integers N and K (1 ≤ N ≤

10000, 1 ≤ K ≤ 100) separated by a single space, followed by a

line containing a string of length N+K consisting of small Latin

letters a..z.

Output

For each test case output just one line containing the required

number modulo 1009419529.

Example

Input:
3
2 1
aaa
3 1
abcd
4 2
ababab

Output:
0
3
10

Explanation:
In the first test case, the password is definitely "aa". In the

second test case, it can be "abc", "abd", "acd" or "bcd", so in

the worst case Chef will guess the correct option from the

fourth attempt, thus making 3 unsuccessful attempts.

Description
你把一个长为N的小写字母组成的密码保存在一个txt文件里;一个熊孩子

在密码的某些位置插入了共计K个字母,注意这里的K个字母不存在重复;

你决定把密码重新试出来;求最坏的情况下需要试多少次?
规定:N<=1W,K<=100

Solution
我们选择用递推的方式计数
先设计计数状态吧
设f[i][j]为前i位中去掉了j位且第i个字符未删除的方案数
那么我们的递推式是f[i][j]=f[i-1][j]+f[i-2][j-1]+f[i-3][j-2]+...
直接枚举每次累加的时间复杂度为O(N*K*K),超时
由于除了f[i-1][j]以外,其他项可以看作是递推矩阵中一个对角线上的

数字和,即∑f[i-x][j-x+1]
那么考虑前缀和优化,多加几个数组就行了
优化后的时间复杂度为O(N*K),O(100W)->AC
Code

#include <stdio.h>
#include <memory.h>
#define MaxL 10110
#define MaxK 110
#define MaxBuf 1<<22
#define mo 1009419529
#define RG register
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
#define dmin(a,b) ((a)<(b)?(a):(b))
#define dmax(a,b) ((a)>(b)?(a):(b))
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(RG Type &x){
x=;RG int c=Blue();
for(;c<||c>;c=Blue())
;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
}
inline void geTc(char *C){
char c=Blue();
for(;c<'a'||c>'z';c=Blue())
;
for(;c>='a'&&c<='z';c=Blue())
*C++=c;
}
char ch[MaxL];
int kase,n,k,f[MaxL][MaxK],g[MaxL],h[][MaxL],ans;
#define FO(x) {freopen(#x".in","r",stdin);}
int main(){
FO(cc authen failed);
Rin(kase);
while(kase--){
memset(f,,sizeof f);
memset(g,,sizeof g);
memset(h,,sizeof h);
ans=;
Rin(n),Rin(k),geTc(ch);
f[][]=g[]=;
for(RG int i=;i<=n+k;i++){
RG int s=ch[i-]-'a';
for(RG int j=;j<=dmin(i-,k);j++){
f[i][j]=(g[i-j-]-h[s][i-j])%mo;
if(i-j==n)(ans+=f[i][j])%=mo;
(g[i-j]+=f[i][j])%=mo;
(h[s][i-j]+=f[i][j])%=mo;
}
}
printf("%d\n",(ans-+mo)%mo);
}
return ;
}

codechef 营养题 第一弹的更多相关文章

  1. codechef营养题 第二弹

    第二弾が始まる! codechef problems 第二弹 一.Backup Functions 题面 One unavoidable problem with running a restaura ...

  2. codechef营养题 第三弹

    第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...

  3. espcms代码审计第一弹

    以前的代码审计都是在CTF比赛题里面进行对于某一段代码的审计,对于后端php整体代码和后端整体架构了解的却很少,所以有空我都会学习php的代码审计,以提高自己 环境就直接用的是phpstudy,学习的 ...

  4. 关于『HTML』:第一弹

    关于『HTML』:第一弹 建议缩放90%食用 根据C2024XSC212童鞋的提问, 我准备写一稿关于『HTML』基础的帖 But! 当我看到了C2024XSC130的 "关于『HTML5』 ...

  5. typecho流程原理和插件机制浅析(第一弹)

    typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...

  6. 我的长大app开发教程第一弹:Fragment布局

    在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发“我的长大”这个Android应用. 在开始之前,我先来介绍一下“我的长大”:这是一个校园社交app,准 ...

  7. Hadoop基础-MapReduce的工作原理第一弹

    Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...

  8. Java基础-程序流程控制第一弹(分支结构/选择结构)

    Java基础-程序流程控制第一弹(分支结构/选择结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.if语句 1>.if语句的第一种格式 if(条件表达式){ 语句体: ...

  9. RMQ_第一弹_Sparse Table

    title: RMQ_第一弹_Sparse Table date: 2018-09-21 21:33:45 tags: acm RMQ ST dp 数据结构 算法 categories: ACM 概述 ...

随机推荐

  1. Rails 确认params的统一方法

    创建: 2017/11/06    Gemfile  ### デバッグ出力の整形  gem 'awesome_print', :group => [:development, :test]  a ...

  2. J20170528-ts

    断片 片断 くどい     啰嗦 アノテーション 注释 annotation

  3. 多条件查询测试用例设计方法(1)—Pairwise(转)

    在我的工作中,我也遇到类似需求.正交法是一种不错的选择,而在我们实践过程中,我们还用了Pairwise方法,以及另一种方法(如下): 假设查询因子:A,B,C,D,E 1.单独查询:A:B:C:D:E ...

  4. array_column() 函数[二维数组转为一维数组]

    array_column() 函数 输出数组中某个键值的集合[二维数组转为一位数组] <?php // 表示由数据库返回的可能记录集的数组 $a = array( array( 'id' =&g ...

  5. [POI2015]Wycieczki

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入输出 ...

  6. ACM_四数之和

    四数之和 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个不同的整数,判断能否从中选4次,4个数和刚好为m.数字可重复选取. ...

  7. pyinstaller打包报错:AttributeError: 'str' object has no attribute 'items'

    导致原因和python多数奇奇怪怪的问题一样,依赖包的版本问题. 解决办法: 对setuptools这个包进行升级,链接在这里 https://pypi.org/project/setuptools/ ...

  8. Linux用户、用户组权限管理详解

    Linux用户管理三个重要文件详解: Linux登陆需要用户名.密码./etc/passwd 文件保存用户名.登录Linux时,Linux 先查找 /etc/passwd 文件中是否有这个用户名,没有 ...

  9. CF798C Mike and gcd problem

    思路: 首先如果数列的最大公约数大于1,直接输出即可. 否则,设对原数列中的ai和ai+1进行一次操作,分别变为ai - ai+1和ai + ai+1.设新数列的最大公约数为d,则由于d|(ai - ...

  10. 【前端路由】Vue-router 中hash模式和history模式的区别

    咱们今天说说VUE路由的hash模式与history模式的区别,这个也是面试常问的问题,不要小看这道题其实问到这里的时候那个面试官应该是个大牛,开发经验丰富,这个题其实就是考验你的开发经验是否属实. ...