一、题目
二、解法
还是太自信了,以后刷水题要注意,这次踩了很多坑点 q w q qwq qwq。
这道题就是广义后缀自动机的一眼题,一开始以为直接用 s i z siz siz就可以了(是错的),但是本题需要线段树合并来维护一个节点出现在多少个串中,然后直接算 f a i l fail fail链上的贡献和,注意一个节点的贡献是 l e n [ u ] − l e n [ f a [ u ] ] len[u]-len[fa[u]] len[u]−len[fa[u]]而不是 1 1 1
还要注意一下线段树合并的写法,需要特判叶子的出现次数为 1 1 1,时间复杂度 O ( n log n ) O(n\log n) O(nlogn),很容易就写过了,还有不懂得看代码吧。
#include <cstdio>
#include <cstring>
const int M = 200005;
int read()
{
int x=0,flag=1;
char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)