Gym 101205D

题意:f[0] = "0", f[1] = "1",接下来f[i] = f[i-1] + f[i-2],相当于字符串拼接。然后给出一个n和一个串s,问f[n]里面有多少个s。

思路:在int范围内的f[n]是n=31的时候,但是匹配的s的长度只有1e5,这时候n=27刚好大于它,因此可以先求解出n<=27的串的情况,然后由这些串来得到n>27的时候的情况。

比赛的时候想着递归算,结果爆栈。

看别人的代码之后我的理解是这样的:

(1)当n<=28的时候,可以直接kmp算。

(2)当n>28的时候,我们可以得到下面的递推式:(ans[i]表示f[i]里面有多少个s.可以先kmp求出ans[i](25 <= i <= 28) ).

先定义odd = ans[27] - ans[26] - ans[25](即得到s[27]由s[26]和s[25]拼接起来的时候能多得到的答案).

even = ans[28] - ans[27] - ans[26](即得到s[28]由s[27]和s[26]拼接起来的时候能多得到的答案).

因为len(s[27])和len(s[28])一定大于匹配的s,因此不用每次都暴力求解拼接起来的时候能多得到的答案,只需要在i为奇数的时候加上odd,i为偶数的时候加上even就可以得到拼接起来能多得到的答案了。

一开始以为奇偶是一样的情况,但是WA8之后问别人才知道是不一样的。

找6号串和找5号串的情况,可以发现6号串可以出现在8号串连接处而不能出现在7和9号串连接处。5号串能出现在7和9号的连接处但是不能出现在8号串的连接处,所以应当是分开考虑的。

这就是WF最水的题目之一...

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 105
  4. #define M 100010
  5. typedef long long LL;
  6. int nxt[M], len[N], sz;
  7. string str, s[N];
  8. LL ans[N];
  9.  
  10. void Make_Next() {
  11. int i, j; j = nxt[] = -; i = ;
  12. while(i < sz) {
  13. while(j != - && str[i] != str[j]) j = nxt[j];
  14. if(str[++i] == str[++j]) nxt[i] = nxt[j];
  15. else nxt[i] = j;
  16. }
  17. }
  18.  
  19. LL Kmp(int id) {
  20. int i = , j = , ans = ;
  21. while(i < len[id]) {
  22. while(- != j && s[id][i] != str[j]) j = nxt[j];
  23. i++; j++;
  24. if(j >= sz) { ans++; j = nxt[j]; }
  25. }
  26. return ans;
  27. }
  28.  
  29. int main() {
  30. int n, cas = ;
  31. s[] = "", s[] = ""; len[] = len[] = ;
  32. for(int i = ; i <= ; i++) s[i] = s[i-] + s[i-], len[i] = len[i-] + len[i-];
  33. while(~scanf("%d", &n)) {
  34. cin >> str;
  35. sz = str.length(); Make_Next();
  36. if(n <= ) { printf("Case %d: %lld\n", cas++, Kmp(n)); continue; }
  37. for(int i = ; i <= ; i++) ans[i] = Kmp(i);
  38. LL odd = ans[] - ans[] - ans[], eve = ans[] - ans[] - ans[]; // 拼接起来能够得到的贡献
  39. for(int i = ; i <= n; i++) {
  40. ans[i] = ans[i-] + ans[i-];
  41. if(i & ) ans[i] += odd;
  42. else ans[i] += eve;
  43. }
  44. printf("Case %d: %lld\n", cas++, ans[n]);
  45. }
  46. return ;
  47. }

Codeforces Gym101205D:Fibonacci Words(KMP+递推)的更多相关文章

  1. codeforces D. Queue 找规律+递推

    题目链接: http://codeforces.com/problemset/problem/353/D?mobile=true H. Queue time limit per test 1 seco ...

  2. codeforces 735C Tennis Championship(贪心+递推)

    Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...

  3. Codeforces1065G Fibonacci Suffix 【递推】【二分答案】

    题目分析: 首先为了简便起见我们把前$15$的答案找出来,免得我们还要特判$200$以内之类的麻烦事. 然后我们从$16$开始递推.考虑猜测第i位是$0$还是$1$(这本质上是个二分).一开始先猜是$ ...

  4. SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)

    Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...

  5. Codeforces Round #260(div2)C(递推)

    有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了 ...

  6. HDU 3336 - Count the string(KMP+递推)

    题意:给一个字符串,问该字符串的所有前缀与该字符串的匹配数目总和是多少. 此题要用KMP的next和DP来做. next[i]的含义是当第i个字符失配时,匹配指针应该回溯到的字符位置. 下标从0开始. ...

  7. Codeforces 177G2 Fibonacci Strings KMP 矩阵

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF117G2.html 题目传送门 - CF177G2 题意 定义斐波那契字符串如下: $s_1="a ...

  8. Codeforces 429B Working out(递推DP)

    题目链接:http://codeforces.com/problemset/problem/429/B 题目大意:两个人(假设为A,B),打算健身,有N行M列个房间,每个房间能消耗Map[i][j]的 ...

  9. 51nod1149 Pi的递推式

    基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x ...

随机推荐

  1. POJ读书笔记2.1 —— 鸡兔笼带

    http://blog.csdn.net/pipisorry/article/details/36433305 问题描写叙述  一个笼子里面关了鸡和兔子(鸡有2仅仅脚.兔子有4仅仅脚.没有例外). 已 ...

  2. WPF特效-拼图游戏

    原文:WPF特效-拼图游戏 此文主要描述我实现碎片化的便捷过程. 步骤1:    选取参考图如下(百度图库搜的): 步骤2:    根据效果图或者模型构建贝塞尔曲线,为了方便查看效果,可以设置控制点, ...

  3. WPF ValidationRule的特点(默认目标-源才校验)

    默认是当目标发生改变时候,通过绑定改变源时候进行校验,因为WPF认为源是安全的,如果想让源改变时候,也进行校验则设置验证规则的ValidatesOnTargetUpdated =true using ...

  4. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...

  5. WPF读取和显示word

    引言 在项目开发中,word的读取和显示会经常出现在客户的需求中.特别是一些有关法律规章制度.通知.红头文件等,都是用word发布的. 在WPF中,对显示WORD没有特定的控件,这对开发显示WORD的 ...

  6. 【Linux】查看物理CPU个数、核数、逻辑CPU个数

    ①物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id) cat /proc/cpuinfo| grep "physical id ...

  7. 基于vue开发的多功能的时间选择器组件,开箱即用

    好一段时间没有写过博客了,在国庆期间心血来潮优化了一个组件,在日常开发中时常会有需求用到时间选择器,不同的项目需求可能会不一样.近期开发的几个项目中就有需求用到这样的选择器,由于以前有用到相关的组件, ...

  8. 隐藏system窗口你也行(就是那个cmd窗口,好多方法)

    新process的启动,可以通过system(const char*)函数启动另外一个程序,但是有一个小问题,就是每次执行system函数的时候,都会弹出dos窗口(命令行嘛~~~),有没有什么方法能 ...

  9. Win8Metro(C#)数字图像处理--2.27图像加法运算

    原文:Win8Metro(C#)数字图像处理--2.27图像加法运算  [函数名称] 图像加法函数AddProcess(WriteableBitmap src, WriteableBitmap a ...

  10. TP5.0中使用trace调试

    1.在项目 的配置文件config.php 配置, 2.在程序中使用trace: 3.在浏览器网页上打开 得到如下图所示:点击 “用户变量”,即可查看使用trace输出的变量 或者我们使用 trace ...