原題鏈結
題意思路
我們知道字尾自動機中,每個節點代表的不同子串數量為
\[cnt_v = len(v) - len(link(v))
\]\[ans += len(v) - len(link(v)
\]然後如果某個節點在訪問之前就達到了k,則不需要繼續向上更新了,因為上面的節點也肯定大於等於k,並且在之前就被記錄了
ac**
#include #include #include #include using namespace std;
const int n = 250000;
int n, m, k, last = 0, co = 0;
long long ans = 0;
char ss[n + 5];
struct sam
sam[n * 2 + 5];
void inits(int o)
}void update(int o)
o = sam[o].fail; }}
void add(char c)
if (p == -1)
else
else
}} last = noww;
update(noww);
}int main()
for (int i = 1; i <= m; ++i)
else
}} return 0;
}
HDU4622 字尾自動機
題目 reincarnation 題意 給定乙個字串,然後再給定q個詢問,每個詢問是乙個區間 l,r 問在這個字串區間中有多少個不同的子串。字尾自動機模版題 include include include include using namespace std const int n 5010 st...
hdu4436 字尾自動機
題解 求多個字串能夠構成多少種數然後把這些數去重後加起來,字尾自動機有個性質就是路徑數就等於不同子串個數,然後怎麼把多個字串拼接呢,兩個字串中間加入乙個你不會用的字元,因為這樣可以保證我到時候路徑不會走這條 include include include include include includ...
HDU 4622(字尾自動機)
czh得意的向cry炫耀自己的英文水平,cry很不屑的扔給czh一篇文章,雖然czh看完之後頭暈眼花,但他還是決定猜測一下文章中單詞的意思,由於文章連空格都沒有,這大大增加了閱讀的難度,於是他決定退而求其次,只需要計算一下從第l個字元到第r個字元中有多少個可能的互不相同單詞 任意長度 1 任意組合的...