對於i,a[i]即為i之後的所有a[i]的和加字尾s[0]與s[i]的最長公用字首。
求fbi時可以先打表打出前100000個,小的直接查表,大的用矩陣快速冪求。
/*
* this code is made by 2bpencil
* problem: 1116
* verdict: accepted
* submission date: 2014-06-10 10:18:07
* time: 184 ms
* memory: 12800 kb
*/#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
ll mod=1e9+7;
ll fbi[10002];
void init()
struct matrix
}return ret;
}};matrix pow_m(matrix a,long long n)
return ret;
}
long long calc(long long n)
const int n = 100110;
int r[n], tx[n], ty[n], rs[n], ranks[n], sa[n], height[n], rmq[n][20]; //rs基數排序
char s[n];
bool cmp(int *r, int a, int b, int len)
void suffix(int n, int m) //n為長度,最大值小於m
for(i = 1; i < m; ++i)
rs[i] += rs[i - 1];
for(i = n - 1; i >= 0; --i)
sa[--rs[x[i]]] = i;
for(j = p = 1; p < n; j <<= 1, m = p)
for(i = 0; i < m; ++i)
rs[i] = 0;
for(i = 0; i < n; ++i)
++rs[x[y[i]]];
for(i = 1; i < m; ++i)
rs[i] += rs[i - 1];
for(i = n - 1; i >= 0; --i)
sa[--rs[x[y[i]]]] = y[i];
t = x, x = y, y = t;
for(i = 1, p = 1, x[sa[0]] = 0; i < n; ++i)
}/**for(i = 0; i < n; ++i)
printf("%s\n", s + sa[i]);*/}
void calheight(int n)}
void initrmq(int n)
}}int log[n];
void initlog()
//求兩個串的最長公共子串
int main()
temp+=l;
ans = (ans+calc(temp))%mod;
printf("%lld\n", ans);
}return 0;
}
ACdream群賽 Apple (dfs 博弈論)
題目鏈結 題目大意 給你n個籃子和m個蘋果,每個籃子和蘋果都不一樣,每次操作可以加乙個籃子或加乙個蘋果,當把蘋果放進籃子的組合方法超過a時,該操作者輸 這題我首先就想到dfs 博弈論可以解的,可是當n為1的時候,兩人都無法取勝的時候為平局 這裡我之前沒想到然後就一直re 最後想到之後改了一下 就無限...
奮鬥群群賽 4
t2arpa and an exam about geometry t3five dimensional points t4polycarpus dice總結 t1位置所在 有一排觀眾席,有n個人,當t 1時第乙個人站起來,t 2時第二個人站起來,t 3時第三個人站起來 到k位置,都是站起來,但是k...
奮鬥群群賽 9
t2the queue t3garland t4cartons of milk t5change free總結 t1位置所在 就是給你n個數字,讓你建乙個塔,從n到底部而且最後再到1,輸入天數,如果可以建立塔的話,輸出這些部分,如果沒有可以建的東西,就輸出換行就好了,第i位對應第i天下下來的食物!求...