BZOJ4327 JSOI2012玄武密碼

2021-08-13 12:20:36 字數 1337 閱讀 1077

description

在美麗的玄武湖畔,雞鳴寺邊,雞籠山前,有一塊富饒而秀美的土地,人們喚作進香河。相傳一日,一縷紫氣從天而至,只一瞬間便消失在了進香河中。老人們說,這是玄武神靈將天書藏匿在此。

很多年後,人們終於在進香河地區發現了帶有玄武密碼的文字。更加神奇的是,這份帶有玄武密碼的文字,與玄武湖南岸台城的結構有微妙的關聯。於是,漫長的破譯工作開始了。

經過分析,我們可以用東南西北四個方向來描述台城城磚的擺放,不妨用乙個長度為n的序列來描述,序列中的元素分別是『e』,『s』,『w』,『n』,代表了東南西北四向,我們稱之為母串。而神秘的玄武密碼是由四象的圖案描述而成的m段文字。這裡的四象,分別是東之青龍,西之白虎,南之朱雀,北之玄武,對東南西北四向相對應。

現在,考古工作者遇到了乙個難題。對於每一段文字,其字首在母串上的最大匹配長度是多少呢?

input

第一行有兩個整數,n和m,分別表示母串的長度和文字段的個數。

第二行是乙個長度為n的字串,所有字元都滿足是e,s,w和n中的乙個。

之後m行,每行有乙個字串,描述了一段帶有玄武密碼的文字。依然滿足,所有字元都滿足是e,s,w和n中的乙個。

output

輸出有m行,對應m段文字。

每一行輸出乙個數,表示這一段文字的字首與母串的最大匹配串長度。

sample input

7 3snnssns

nnss

nnnwsee

sample output 40

hint

對於100%的資料,n<=10^7,m<=10^5,每一段文字的長度<=100。

應上傳者要求,此題不公開,如有異議,請提出.

sam模板題。

注意開兩倍空間。

#include 

#define n 10000010

#define m 110

using namespace std;

int n,m,to[m];

char s[n],z[m];

struct nodet[n<<1],*root=t,*tail=t;

node *newnode()

node* add(node *p,int c)

i->ch[c]=cur;

}if (q==t)

if (q->dep==f->dep+1)

cur->fail=q;

else

return cur;

}void build()

int main()

printf("%d\n",ans);

}return

0;}

BZOJ 4327 JSOI2012 玄武密碼

字尾自動機裸題。藉著這道裸題總結一下字尾自動機的查詢問題。1.查字首 查詢時不跳parent,遇到空節點就跳出。2.查子串 查詢時跳parent,記錄最大ans.3.查次數 lct維護right陣列 4.查不同的串的數目 在建樹時維護,乙個點對答案的貢獻為this max len this pare...

BZOJ4327 JSOI2012 玄武密碼

對所有詢問串建立ac自動機。然後將母串在ac自動機上跑,每走到乙個點x,從x點出發沿著fail指標能到的所有字首都是匹配成功的,暴力向上走,碰到走過的就break,這樣每個點最多隻會被標記一次。時間複雜度 o n 100m include includeconst int n 10000003,m ...

玄武密碼(bzoj4327)(JSOI2012)

題目描述 原題來自 jsoi 2012 在美麗的玄武湖畔,雞鳴寺邊,雞籠山前,有一塊富饒而秀美的土地,人們喚作進香河。相傳一日,一縷紫氣從天而至,只一瞬間便消失在了進香河中。老人們說,這是玄武神靈將天書藏匿在此。很多年後,人們終於在進香河地區發現了帶有玄武密碼的文字。更加神奇的是,這份帶有玄武密碼的...