秩序魔咒,洛谷P5555,廣義SAM PAM

2021-10-09 07:45:03 字數 741 閱讀 3117

雖然有一點難寫,但是挺好想的.

大概就是用pam求出所有本質不同的回文串,然後在sam上看看對應點的right集合是否在兩點都出現過,希望有大牛發明出廣義pam?

#includeusing namespace std;

const int n=1200010;

char s[n],t[n];

int n,m,mmax,num;

struct suffix_automaton

return ;

} int x=++tot,p=las;las=x;len[x]=len[p]+1;

while(p!=-1 && !ch[p][c]) ch[p][c]=x,p=fa[p][0];

if(p==-1) return ;

if(len[ch[p][c]]==len[p]+1) fa[x][0]=ch[p][c];

else

return ;

} void build()

} void solve(int r,int lenth)

}}sam;

struct palindrome_automaton

int gfail(int x,int pos)

void insert(int pos,int c)

las=ch[p][c];

} void build()

}pam;

int main()

P5555 秩序魔咒

題意 給你兩個字串,求出這兩個字串的最長公共回文子串長度和個數 題解 我們可以對這兩個字串分別建回文樹,然後同時進行dfs,走相同的轉移邊,得到的回文串顯然是相同的,由於回文串的長度可以為奇數也可以為偶數,所以我們需要對奇根節點和偶根節點進行dfs,就可以找到最長公共回文子串長度了,至於個數,由於在...

洛谷P5555 秩序魔咒 回文自動機

要求是回文子串,考慮對兩個字串分別建出回文自動機,然後同時在起點出發 odd 或 even 始終按照相同字元的轉移走,那麼一定走到的是二者都含有的子串,沿途經過的點就是符合條件的回文子串了。於是用 bfs 或 dfs 實現均可,博主使用的是 bfs 方法,就先將 0 和 1 push 進佇列中,然後...

洛谷P4070 生成魔咒

魔咒串由許多魔咒字元組成,魔咒字元可以用數字表示。例如可以將魔咒字元 1,2 拼湊起來形成乙個魔咒串 1,2 乙個魔咒串 s 的非空字串被稱為魔咒串 s 的生成魔咒。例如 s 1,2,1 時,它的生成魔咒有 1 2 1,2 2,1 1,2,1 五種。s 1,1,1 時,它的生成魔咒有 1 1,1 1...