Codeforces Gym101205D:Fibonacci Words(KMP+递推)
题意: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最水的题目之一...
#include <bits/stdc++.h>
using namespace std;
#define N 105
#define M 100010
typedef long long LL;
int nxt[M], len[N], sz;
string str, s[N];
LL ans[N]; void Make_Next() {
int i, j; j = nxt[] = -; i = ;
while(i < sz) {
while(j != - && str[i] != str[j]) j = nxt[j];
if(str[++i] == str[++j]) nxt[i] = nxt[j];
else nxt[i] = j;
}
} LL Kmp(int id) {
int i = , j = , ans = ;
while(i < len[id]) {
while(- != j && s[id][i] != str[j]) j = nxt[j];
i++; j++;
if(j >= sz) { ans++; j = nxt[j]; }
}
return ans;
} int main() {
int n, cas = ;
s[] = "", s[] = ""; len[] = len[] = ;
for(int i = ; i <= ; i++) s[i] = s[i-] + s[i-], len[i] = len[i-] + len[i-];
while(~scanf("%d", &n)) {
cin >> str;
sz = str.length(); Make_Next();
if(n <= ) { printf("Case %d: %lld\n", cas++, Kmp(n)); continue; }
for(int i = ; i <= ; i++) ans[i] = Kmp(i);
LL odd = ans[] - ans[] - ans[], eve = ans[] - ans[] - ans[]; // 拼接起来能够得到的贡献
for(int i = ; i <= n; i++) {
ans[i] = ans[i-] + ans[i-];
if(i & ) ans[i] += odd;
else ans[i] += eve;
}
printf("Case %d: %lld\n", cas++, ans[n]);
}
return ;
}
Codeforces Gym101205D:Fibonacci Words(KMP+递推)的更多相关文章
- codeforces D. Queue 找规律+递推
题目链接: http://codeforces.com/problemset/problem/353/D?mobile=true H. Queue time limit per test 1 seco ...
- codeforces 735C Tennis Championship(贪心+递推)
Tennis Championship 题目链接:http://codeforces.com/problemset/problem/735/C ——每天在线,欢迎留言谈论. 题目大意: 给你一个 n ...
- Codeforces1065G Fibonacci Suffix 【递推】【二分答案】
题目分析: 首先为了简便起见我们把前$15$的答案找出来,免得我们还要特判$200$以内之类的麻烦事. 然后我们从$16$开始递推.考虑猜测第i位是$0$还是$1$(这本质上是个二分).一开始先猜是$ ...
- SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)
Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...
- Codeforces Round #260(div2)C(递推)
有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了 ...
- HDU 3336 - Count the string(KMP+递推)
题意:给一个字符串,问该字符串的所有前缀与该字符串的匹配数目总和是多少. 此题要用KMP的next和DP来做. next[i]的含义是当第i个字符失配时,匹配指针应该回溯到的字符位置. 下标从0开始. ...
- Codeforces 177G2 Fibonacci Strings KMP 矩阵
原文链接https://www.cnblogs.com/zhouzhendong/p/CF117G2.html 题目传送门 - CF177G2 题意 定义斐波那契字符串如下: $s_1="a ...
- Codeforces 429B Working out(递推DP)
题目链接:http://codeforces.com/problemset/problem/429/B 题目大意:两个人(假设为A,B),打算健身,有N行M列个房间,每个房间能消耗Map[i][j]的 ...
- 51nod1149 Pi的递推式
基准时间限制:1 秒 空间限制:131072 KB 分值: 640 F(x) = 1 (0 <= x < 4) F(x) = F(x - 1) + F(x - pi) (4 <= x ...
随机推荐
- 2019 renew 博客目录
.net && .net core Microsoft.AspNet.SignalR实现弹幕(即时通讯) C#调用JS httpclient POST请求(urlencoded) 二维 ...
- socket函数集-----网络编程必备值得拥有
accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #include<sys/types.h> #include<sys/ ...
- vs2015 生成 cordova 页面中文乱码
原文:vs2015 生成 cordova 页面中文乱码 1.用VS2015新创建Cordova项目,启动运行index.html 中文显示乱码 解决方案: 1.使用text/html通用解析编码utf ...
- Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法
原文:Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法 [函数名称] 部分彩色保留函数 WriteableBitmap PartialcolorProcess ...
- golang1.8 通过plugin方式build so
golang1.83只有linux下支持plugin方式生成so package main // // No C code needed. import "C" import ( ...
- js通过沿着作用域链还是原型链查找变量
这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...
- Android 9.0 Dialog不显示
Tester报了一个bug,大概如下: 页面:Activity1 dialog1(半透明遮罩样式) Activity2 dialog2 场景:Activity1弹出dialog1,dialog1弹出a ...
- WPF应用程序如何重启当前的Application
// Restart current process Method 1 System.Windows.Forms.Application.Restart(); Application.Current. ...
- 求 1-2+3-4+5-6+7-8....M 的结果算法
static void Main(string[] args) { /** * 算法题: * 求 1-2+3-4+5-6+7-8....M 的结果. * */ //存储运算结果. ; //记号. ; ...
- Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总
一.目录 转载1: http://my.oschina.NET/fanhuazi/blog/737224?ref=myread 点击打开链接 转载2: http://www.qtcn.org/bbs/ ...