题意:
给出一个斐波那契序列,F[0] = “0” , F[1] = “1” , F[i] = F[i - 2] + F[i - 1]. 求第k小的后缀的前m位。
题解
直接按位贪心
每次check一个前缀在F[n]中的出现次数。
这个可以维护pre,suf , num表示F[i]和当前串的前后缀匹配长度和当前串出现次数
长度不够默认可以匹配,用bitset优化合并
复杂度O(n * m * m/32)
注意特判当前串是否作为一个后缀出现,因为总是把后面的串作为后缀,暴力跑200位然后判断即可
还有几个坑点:
出现次数可能很大,会爆longlong,要和inf取min
注意每次check的清空和初始化
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(register int i = l ; i <= r ; i++)
#define repd(i,r,l) for(register int i = r ; i >= l ; i--)
#define rvc(i,S) for(register int i = 0 ; i < (int)S.size() ; i++)
#define rvcd(i,S) for(register int i = ((int)S.size()) - 1 ; i >= 0 ; i--)
#define fore(i,x)for (register int i = head[x] ; i ; i = e[i].next)
#define forup(i,l,r) for (register int i = l ; i <= r ; i += lowbit(i))
#define fordown(i,id) for (register int i = id ; i ; i -= lowbit(i))
#define pb push_back
#define prev prev_
#define stack stack_
#define mp make_pair
#define fi first
#define se second
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pr;
const ll inf = 1e18;
const int N = 220;
const int maxn = 220;
const ll mod = 1e9 + 7;
struct node{
ll num,len;
bitset <N> pre,suf;
node() {
num = len = 0; pre.reset(),suf.reset(); }
void clear(){
num = len = 0;
pre.reset() , suf.reset();
}
}f[220];
int fail[maxn];
struct node2{
int len;
int s[maxn * 10];
node2(){
len = 0;
}