題目大意:求出乙個字串$s$每一位的$num[i]$,最多$5$組詢問,$|s|\leqslant10^6$
$num[i]$定義為$s_$中長度不超過$\lfloor\dfrac i2\rfloor$的$border$的個數
題解:類似$kmp$。發現乙個字串$border$的$border$一定是原串的$border$,並且若每次是最長$border$的話,所有的$border$均會被列舉到。令$res[i]$表示$s_$的$border$個數$+1$(即包括$s_$),則若$s_$為$s_$的乙個$border$且$i$為所有滿足$i\leqslant\lfloor\dfrac j2\rfloor$中最大的,則$num[j]=res[i]$。$res$陣列可以在求$nxt$陣列時順帶求出。現在就是要對於$j$快速求出$i$。可以通過類似$kmp$的方法,求出了$j$對應的$i$,在就$j+1$時,就直接對$i$進行修改,若$i>\lfloor\dfrac j2\rfloor$,重複$i=nxt[i]$直到滿足條件。這樣複雜度和$kmp$一樣是$o(n)$的
卡點:無
c++ code:
#include #include #include #include const int maxn = 1e6 + 10, mod = 1e9 + 7;int tim, n, ans;
char s[maxn];
int nxt[maxn], res[maxn];
int main()
for (int i = 2, j = 0; i <= n; ++i)
std::cout << ans << '\n';
} return 0;
}
洛谷 P2375 NOI2014 動物園
其實對於乙個sum i 其值就等於sum next i sum next next i 1,然後我們可以記憶化,然後題目裡又有乙個限制,就是前字尾不能重合,那我們就找到最大但是不重合的那種情況,然後往小了列舉就好了.最後答案說要取模,所以不要忘了 ljx xhy yyq 排名無先後 1 includ...
題解 P2375 NOI2014 動物園
luogu 先用裸的 kmp 求出 fail next 陣列 隨便叫的無所謂啦 和不管重疊時的數量記為 ans ans 的定義類似於 fail next 然後再跑一遍,求出 frac 的數量,可結合 理解 includeusing namespace std int n,l,fail 1000010...
洛谷P2014 選課
題目描述 在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程...