Nhảy chuyển đến

Hồi văn thụ

Định nghĩa

Hồi văn thụ ( EER Tree, Palindromic Tree, cũng bị xưng là Hồi văn tự động cơ ) là một loại có thể tồn trữ một cái xuyến trung sở hữu Hồi văn tử xuyến hiệu suất cao số liệu kết cấu. Lúc ban đầu từ Mikhail Rubinchik cùng Arseny M. Shur ở 2015 năm phát biểu. Nó nguồn cảm hứng với hậu tố thụ chờ tự phù xuyến hậu tố số liệu kết cấu, sử dụng Hồi văn thụ có thể đơn giản hiệu suất cao mà giải quyết một loạt đề cập Hồi văn xuyến vấn đề.

Kết cấu

Hồi văn thụ đại khái trường như vậy

Cùng cái khác tự động cơ cùng loại, Hồi văn thụ cũng là từ dời đi biên cùng hậu tố liên tiếp ( fail kim đồng hồ ) tạo thành, mỗi cái tiết điểm đều có thể đại biểu một cái Hồi văn tử xuyến.

Bởi vì Hồi văn xuyến chiều dài chia làm số lẻ cùng số chẵn, chúng ta có thể giống manacher như vậy gia nhập một cái không ở tự phù tập trung tự phù ( như '#' ) làm phân cách phù tới đem sở hữu Hồi văn xuyến chiều dài đều biến thành số lẻ, nhưng là như vậy quá mức phiền toái. Có hay không càng tốt biện pháp đâu?

Đáp án tự nhiên là có. Càng tốt biện pháp chính là kiến hai cây, một thân cây trung tiết điểm đối ứng Hồi văn tử xuyến chiều dài đều vì số lẻ, một khác cây trung tiết điểm đối ứng Hồi văn tử xuyến chiều dài đều vì số chẵn.

Cùng cái khác tự động cơ giống nhau, một cái tiết điểm fail kim đồng hồ chỉ hướng chính là cái này tiết điểm sở đại biểu Hồi văn xuyến dài nhất Hồi văn hậu tố sở đối ứng tiết điểm, nhưng là dời đi biên đều không phải là đại biểu ở nguyên tiết điểm đại biểu Hồi văn xuyến sau thêm một chữ phù, mà là tỏ vẻ ở nguyên tiết điểm đại biểu Hồi văn xuyến trước sau các thêm một cái tương đồng tự phù ( không khó lý giải, bởi vì muốn bảo đảm tồn chính là Hồi văn xuyến ).

Chúng ta còn cần ở mỗi cái tiết điểm thượng giữ gìn này tiết điểm đối ứng Hồi văn tử xuyến chiều dài len, cái này tin tức bảo đảm chúng ta có thể thoải mái mà cấu tạo ra Hồi văn thụ.

Kiến tạo

Hồi văn thụ có hai cái mới bắt đầu trạng thái, phân biệt đại biểu chiều dài vìHồi văn xuyến. Chúng ta có thể xưng chúng nó vì kỳ căn, ngẫu nhiên căn. Chúng nó không tỏ vẻ bất luận cái gì thực tế tự phù xuyến, chỉ làm mới bắt đầu trạng thái tồn tại, này cùng mặt khác tự động cơ căn tiết điểm là hiệu quả như nhau.

Ngẫu nhiên căn fail kim đồng hồ chỉ hướng kỳ căn, mà chúng ta cũng không quan tâm kỳ căn fail kim đồng hồ, bởi vì kỳ căn không có khả năng thất xứng ( kỳ căn dời đi ra tiếp theo cái trạng thái chiều dài vì,Tức đơn cái tự phù. Nhất định là Hồi văn tử xuyến )

Cùng loại hậu tố tự động cơ, chúng ta tăng lượng cấu tạo Hồi văn thụ.

Suy xét cấu tạo xong trướcCái tự phù Hồi văn thụ sau, hướng tự động cơ trung tăng thêm ở nguyên xuyến vị trí vìTự phù.

Chúng ta từ trở lên một chữ phù kết cục dài nhất Hồi văn tử xuyến đối ứng tiết giờ bắt đầu, không ngừng dọc theo fail kim đồng hồ đi, thẳng đến tìm được một cái tiết điểm thỏa mãn,Tức thỏa mãn này tiết điểm sở đối ứng Hồi văn tử xuyến thượng một chữ phù cùng đãi tăng thêm tự phù tương đồng.

Nơi này dán ra luận văn trung kia trương đồ

Chúng ta thông qua nhảy fail kim đồng hồ tìm được A sở đối ứng tiết điểm, sau đó hai bên tăng thêmXLiền đến hiện tại Hồi văn xuyến ( tứcXAX), thực hiển nhiên, cái này tiết điểm chính là lấyKết cục dài nhất Hồi văn tử xuyến đối ứng trên cây tiết điểm. ( đồng thời, lúc này chiều dàiTiết điểm ưu thế ra tới, nếu không cóXCó thể xứng đôi điều kiện chính là cùng vị trí,Liền tự nhiên được đến đại biểu tự phùXTiết điểm. ) lúc này muốn phán đoán một chút: Không có cái này tiết điểm, liền yêu cầu tân kiến.

Sau đó chúng ta còn cần cầu ra tân kiến tiết điểm fail kim đồng hồ. Cụ thể phương pháp cùng mặt trên quá trình cùng loại, không ngừng nhảy chuyển fail kim đồng hồ, từAXuất phát, có thể tìm đượcXAXDài nhất Hồi văn hậu tốXBX,Đem đối ứng tiết điểm thiết vì fail kim đồng hồ sở chỉ đối tượng là được.

Hiển nhiên, cái này tiết điểm là không cần tân kiến,ATrướcVị cùng sauVị tương đồng, đều làB,TrướcVị hai đoan căn cứ Hồi văn xuyến đối ứng quan hệ, đều làX,Mặt sau bị khâm định làX,Vì thế cái này tiết điểmXBXKhẳng định đã bị bao hàm.

Nếu fail không xứng đôi đến, như vậy đem nó liền hướng chiều dài vìCái kia tiết điểm, hiển nhiên đây là được không ( bởi vì đây là sở hữu tiết điểm hậu tố ).

Tuyến tính trạng thái số chứng minh

Định lý

Đối với một chữ phù xuyến,Nó bản chất bất đồng Hồi văn tử xuyến cái số nhiều nhất chỉ cóCái.

Chứng minh

Suy xét sử dụng toán học phép quy nạp.

  • ĐươngKhi,Chỉ có một chữ phù, đồng thời cũng chỉ có một cái tử xuyến, hơn nữa cái này tử xuyến là Hồi văn, bởi vậy kết luận thành lập.

  • ĐươngKhi, thiết,Trong đóTỏ vẻCuối cùng gia tăng một chữ phùSau hình thành tự phù xuyến, giả thiết kết luận đốiXuyến thành lập. Suy xét bằng sau một chữ phùKết cục Hồi văn tử xuyến, giả thiết chúng nó tả điểm cuối từ nhỏ đến đại bài tự vì.Bởi vìLà Hồi văn xuyến, bởi vậy đối với sở hữu vị trí,Có.Cho nên, đối với,Đã ởTrung xuất hiện quá. Bởi vậy, mỗi lần gia tăng một chữ phù, bản chất bất đồng Hồi văn tử xuyến cái số nhiều nhất gia tăngCái.

Từ toán học phép quy nạp, cũng biết nên định lý thành lập.

Bởi vậy Hồi văn thụ trạng thái số là.Đối với mỗi một cái trạng thái, nó thực tế chỉ đại biểu một cái bản chất bất đồng Hồi văn tử xuyến, tức chuyển dời đến nên tiết điểm trạng thái duy nhất, bởi vậy tổng dời đi số cũng là.

Chính xác tính chứng minh

Trở lên đồ vì lệ, gia tăng trước mặt tự phùX,Từ tuyến tính trạng thái số chứng minh, chúng ta chỉ cần tìm được bao hàm cuối cùng một chữ phùXDài nhất Hồi văn hậu tố, cũng chính làXAX.Tiếp tục tìm kiếmXAXDài nhất Hồi văn hậu tốXBX,Thành lập hậu tố liên tiếp.XBXĐối ứng trạng thái đã ở Hồi văn thụ trung xuất hiện, bao hàm cuối cùng một chữ phù Hồi văn hậu tố chính làXAX,XBXBản thân và đối ứng trạng thái ở fail trên cây sở hữu tổ tiên.

Đối vớiHồi văn thụ cấu tạo, lệnh,Hiển nhiên trừ bỏ nhảy fail kim đồng hồ mặt khác thao tác đều là.

Gia nhập tự phù khi, ở thượng một lần cơ sở thượng, mỗi lần nhảy fail sau đối ứng tiết điểm ở fail thụ chiều sâu,Mà liên tiếp fail sau, chỉ vì chiều sâu + 1 ( nhưng fail vìKhi ( tức đếnMới phù hợp ), chiều sâu tương đương với ởCơ sở thượng).

Bởi vì chỉ gia nhậpCái tự phù, cho nên chỉ biết thêmThứ chiều sâu, nhiều nhất cũng chỉ sẽ nhảyThứ fail.

Bởi vậy, cấu tạoHồi văn thụ thời gian phức tạp độ là.

Ứng dụng

Bản chất bất đồng Hồi văn tử xuyến cái số

Từ tuyến tính trạng thái số chứng minh, dễ dàng biết một cái xuyến bản chất bất đồng Hồi văn tử xuyến cái số tương đương Hồi văn thụ trạng thái số ( bài trừ kỳ căn cùng ngẫu nhiên căn hai cái trạng thái ).

Hồi văn tử xuyến xuất hiện số lần

Kiến ra Hồi văn thụ, sử dụng cùng loại hậu tố tự động cơ thống kê xuất hiện số lần phương pháp.

Bởi vì Hồi văn thụ cấu tạo trong quá trình, tiết điểm bản thân chính là dựa theo Topology tự cắm vào, bởi vậy chỉ cần nghịch tự cái cử sở hữu trạng thái, đem trước mặt trạng thái xuất hiện số lần thêm đến này fail kim đồng hồ đối ứng trạng thái xuất hiện số lần thượng là được.

Ví dụ mẫu:“APIO2014” Hồi văn xuyến

Định nghĩaMột cái tử xuyến tồn tại giá trị vì cái này tử xuyến ởTrung xuất hiện số lần thừa lấy cái này tử xuyến chiều dài. Đối với cấp định tự phù xuyến,Cầu sở hữu Hồi văn tử xuyến trung lớn nhất tồn tại giá trị.

Tham khảo số hiệu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include&LTbits/stdc++.h>
usingnamespacestd;
constintmaxn=300000+5;

namespacepam{
intsz,tot,last;
intcnt[maxn],ch[maxn][26],len[maxn],fail[maxn];
chars[maxn];

intnode(intl){// thành lập một cái tân tiết điểm, chiều dài vì l
sz++;
memset(ch[sz],0,sizeof(ch[sz]));
len[sz]=l;
fail[sz]=cnt[sz]=0;
returnsz;
}

voidclear(){// khởi động lại
sz=-1;
last=0;
s[tot=0]='$';
node(0);
node(-1);
fail[0]=1;
}

intgetfail(intx){// tìm hậu tố Hồi văn
while(s[tot-len[x]-1]!=s[tot])x=fail[x];
returnx;
}

voidinsert(charc){// thành tựu
s[++tot]=c;
intnow=getfail(last);
if(!ch[now][c-'a']){
intx=node(len[now]+2);
fail[x]=ch[getfail(fail[now])][c-'a'];
ch[now][c-'a']=x;
}
last=ch[now][c-'a'];
cnt[last]++;
}

longlongsolve(){
longlongans=0;
for(inti=sz;i>=0;i--){
cnt[fail[i]]+=cnt[i];
}
for(inti=1;isz;i++){// đổi mới đáp án
ans=max(ans,1ll*len[i]*cnt[i]);
}
returnans;
}
}// namespace pam

chars[maxn];

intmain(){
pam::clear();
scanf("%s",s+1);
for(inti=1;s[i];i++){
pam::insert(s[i]);
}
printf("%lld\n",pam::solve());
return0;
}

Nhỏ nhất Hồi văn phân chia

Cấp định một chữ phù xuyến,Cầu nhỏ nhất,Khiến cho tồn tại,Thỏa mãnĐều vì Hồi văn xuyến, thảTheo thứ tự liên tiếp sau được đến tự phù xuyến tương đương.

Suy xét động thái quy hoạch, nhớTỏ vẻChiều dài vìTiền tố nhỏ nhất xài điểm, dời đi chỉ cần cái cử lấy đệCái tự phù kết cục sở hữu Hồi văn xuyến

HồiVănXuyến

Bởi vì một chữ phù xuyến nhiều nhất sẽ cóCái Hồi văn tử xuyến, bởi vậy kể trên thuật toán thời gian phức tạp độ vì,Vô pháp tiếp thu, vì ưu hoá dời đi quá trình, phía dưới cấp ra một ít dẫn lý.

Nhớ tự phù xuyếnChiều dài vìTiền tố vì,Chiều dài vìHậu tố vì.

Chu kỳ: Nếu,,Liền xưngChu kỳ.

border: Nếu,,Liền xưngborder.

Chu kỳ cùng border quan hệ:border, đương thả chỉ đươngChu kỳ.

Chứng minh

Nếuborder, như vậy,Bởi vậy,Cho nênChính làChu kỳ.

NếuChu kỳ, tắc,Bởi vậy,Cho nênborder.

Dẫn lý một

Là Hồi văn xuyếnHậu tố,border đương thả chỉ đươngLà Hồi văn xuyến.

Chứng minh

Đối với,TừCùngVì Hồi văn xuyến, bởi vậy có,Cho nênborder.

Đối với,Từborder, có,TừLà Hồi văn xuyến, có,Bởi vậy,Cho nênLà Hồi văn xuyến.

Hạ đồ trung, tương đồng nhan sắc vị trí tỏ vẻ tự phù đối ứng tương đồng.

Dẫn lý nhị

Là xuyếnborder (),Là Hồi văn xuyến đương thả chỉ đươngLà Hồi văn xuyến.

Chứng minh

NếuLà Hồi văn xuyến, từ dẫn lý,Cũng là Hồi văn xuyến.

NếuLà Hồi văn xuyến, từborder, bởi vậy,Bởi vì,Cho nênCũng là Hồi văn xuyến.

Dẫn lý tam

Là Hồi văn xuyếnborder, tắcChu kỳ,Nhỏ nhất chu kỳ, đương thả chỉ đươngDài nhất Hồi văn thật hậu tố.

Dẫn lý bốn

Là một cái Hồi văn xuyến,Dài nhất Hồi văn thật hậu tố,Dài nhất Hồi văn thật hậu tố. LệnhPhân biệt vì thỏa mãnTự phù xuyến, tắc có phía dưới ba điều tính chất

  1. ;

  2. Nếu,Như vậy;

  3. Nếu,Như vậy.

Chứng minh
  1. Từ dẫn lýSuy luận,Nhỏ nhất chu kỳ,Nhỏ nhất chu kỳ. Suy xét phép phản chứng, giả thiết,Bởi vìHậu tố, cho nênĐã làChu kỳ, cũng làChu kỳ, màNhỏ nhất chu kỳ, mâu thuẫn. Cho nên.
  2. Bởi vìborder, cho nênTiền tố, thiết tự phù xuyến,Thỏa mãn( như sau đồ sở kỳ ), trong đóborder. Suy xét phép phản chứng, giả thiết,Như vậy,Cho nên từ dẫn lý,Là Hồi văn xuyến, từ dẫn lý,border, lại bởi vì,Cho nên,Mâu thuẫn. Cho nên.
  3. Đều làTiền tố,,Cho nên.

Suy luận

Sở hữu Hồi văn hậu tố dựa theo chiều dài bài tự sau, có thể phân chia thànhĐoạn đẳng cấp dãy số.

Chứng minh

ThiếtSở hữu Hồi văn hậu tố chiều dài từ nhỏ đến lớn bài tự vì.Đối với tùy ý,Nếu,TắcCấu thành một cái đẳng cấp dãy số. Nếu không,Từ dẫn lý,Có,Thả,.Bởi vậy, nếu liền nhau hai đối Hồi văn hậu tố chiều dài chi kém phát sinh biến hóa, như vậy cái này lớn nhất chiều dài nhất định sẽ tương đối với nhỏ nhất chiều dài phiên gấp đôi. Hiển nhiên, chiều dài phiên bội nhiều nhất chỉ biết phát sinhThứ, cũng chính làHồi văn hậu tố chiều dài có thể phân chia thànhĐoạn đẳng cấp dãy số.

Nên suy luận cũng có thể thông qua sử dụng nhược chu kỳ dẫn lý, đốiDài nhất Hồi văn hậu tố sở hữu border dựa theo chiều dàiPhân loại,,Suy xét nàyTổ nội mỗi tổ dài nhất border tiến hành chứng minh. Kỹ càng tỉ mỉ chứng minh có thể tham khảo kim sách 《 tự phù xuyến thuật toán tuyển giảng 》 cùng trần tôn lập 2019 năm IOI quốc gia chờ tuyển đội luận văn 《 tử xuyến chu kỳ tuần tra vấn đề tương quan thuật toán và ứng dụng 》.

Có cái này kết luận sau, chúng ta hiện tại có thể suy xét như thế nào ưu hoáDời đi.

Ưu hoá

Hồi văn trên cây mỗi cái tiết điểmYêu cầu nhiều giữ gìn hai cái tin tức,Cùng.Tỏ vẻ tiết điểmCùngSở đại biểu Hồi văn xuyến chiều dài kém, tức.Tỏ vẻVẫn luôn dọc theo fail hướng về phía trước nhảy đến cái thứ nhất tiết điểm,Khiến cho,Cũng chính làNơi đẳng cấp dãy số trung chiều dài nhỏ nhất cái kia tiết điểm.

Căn cứ mặt trên chứng minh kết luận, nếu sử dụngKim đồng hồ hướng về phía trước nhảy nói, mỗi về phía sau điền thêm một chữ phù, chỉ cần hướng về phía trước nhảyThứ. Bởi vậy, có thể suy xét đem một cái đẳng cấp dãy số tỏ vẻ sở hữu Hồi văn xuyếnGiá trị chi cùng ( ở nguyên vấn đề ngón giữa), ký lục đến dài nhất kia một cái Hồi văn xuyến đối ứng tiết điểm thượng.

Tỏ vẻNơi đẳng cấp dãy sốGiá trị chi cùng, thảLà cái này đẳng cấp dãy số trung chiều dài dài nhất tiết điểm, tắc,Nơi nàyLà trước mặt cái giơ lên hạ tiêu.

Phía dưới chúng ta suy xét như thế nào đổi mớiSố tổ cùngSố tổ. Dưới đồ vì lệ, giả thiết trước mặt cái giơ lên đệCái tự phù, Hồi văn trên cây đối ứng tiết điểm vì.Vì màu cam ba cái vị tríGiá trị chi cùng ( ngắn nhất Hồi văn xuyếnTính tại hạ một cái đẳng cấp dãy số trung ).Thượng một lần xuất hiện vị trí là( ởChỗ kết thúc ),Bao hàmGiá trị là màu lam vị trí. Bởi vậy,Trên thực tế tương đươngCùng nhiều ra tới một vị tríGiá trị chi cùng, nhiều ra tới vị trí là.Cuối cùng lại dùngĐi đổi mới,Này bộ phận đẳng cấp dãy số cống hiến liền tính toán xong, không ngừng nhảy,Lặp lại cái này quá trình là được. Cụ thể thực hiện phương thức nhưng tham khảo ví dụ mẫu số hiệu.

Cuối cùng, kể trên cách làm chính xác tính ỷ lại với: NếuCùngThuộc về cùng cái đẳng cấp dãy số, như vậyThượng một lần xuất hiện vị trí là.

Chứng minh

Căn cứ dẫn lý,border, bởi vậy này ởChỗ xuất hiện.

Giả thiếtTrungVị trí xuất hiện. Bởi vìCùngThuộc về cùng cái đẳng cấp dãy số, bởi vậy.Dư thừaCùngChỗCó liên quan, nhớ giao thoa vì,Thiết xuyếnThỏa mãn.Dùng cùng loại dẫn lýPhương thức có thể chứng minh,Là Hồi văn xuyến, màTiền tốCũng là Hồi văn xuyến, này cùngDài nhất Hồi văn tiền tố ( hậu tố ) mâu thuẫn.

Ví dụ mẫu:Codeforces 932G Palindrome Partition

Cấp định một chữ phù xuyến,Yêu cầu đemPhân chia vì,Trong đóLà số chẵn, thả,Cầu như vậy phân chia phương án số.

Lời giải trong đề bài

Cấu tạo tự phù xuyến,Vấn đề đồng giá với cầuNgẫu nhiên Hồi văn phân chia phương án số, đem mặt trên dời đi phương trình đổi thành cầu hòa hình thức hơn nữa chỉ ở số chẵn vị trí đổi mớiSố tổ là được. Thời gian phức tạp độ,Không gian phức tạp độ.

Tham khảo số hiệu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include&LTbits/stdc++.h>
usingnamespacestd;
typedeflonglongll;
constintmod=1e9+7;
constintmaxn=1000000+5;

intadd(intx,inty){
x+=y;
returnx>=mod?x-=mod:x;
}

namespacepam{
intsz,tot,last;
intch[maxn][26],len[maxn],fail[maxn];
intcnt[maxn],dep[maxn],dif[maxn],slink[maxn];
chars[maxn];

intnode(intl){// thành lập một cái chiều dài vì l tân tiết điểm
sz++;
memset(ch[sz],0,sizeof(ch[sz]));
len[sz]=l;
fail[sz]=0;
cnt[sz]=0;
dep[sz]=0;
returnsz;
}

voidclear(){// khởi động lại
sz=-1;
last=0;
s[tot=0]='$';
node(0);
node(-1);
fail[0]=1;
}

intgetfail(intx){// tìm được hậu tố Hồi văn
while(s[tot-len[x]-1]!=s[tot])x=fail[x];
returnx;
}

voidinsert(charc){// thành tựu
s[++tot]=c;
intnow=getfail(last);
if(!ch[now][c-'a']){
intx=node(len[now]+2);
fail[x]=ch[getfail(fail[now])][c-'a'];
dep[x]=dep[fail[x]]+1;
ch[now][c-'a']=x;
dif[x]=len[x]-len[fail[x]];
if(dif[x]==dif[fail[x]])
slink[x]=slink[fail[x]];
else
slink[x]=fail[x];
}
last=ch[now][c-'a'];
cnt[last]++;
}
}// namespace pam

usingpam::dif;
usingpam::fail;
usingpam::len;
usingpam::slink;
intn,dp[maxn],g[maxn];
chars[maxn],t[maxn];

intmain(){
pam::clear();
scanf("%s",s+1);
n=strlen(s+1);
for(inti=1,j=0;in;i++)t[++j]=s[i],t[++j]=s[n-i+1];
dp[0]=1;
for(inti=1;in;i++){
pam::insert(t[i]);
for(intx=pam::last;x>1;x=slink[x]){
g[x]=dp[i-len[slink[x]]-dif[x]];
if(dif[x]==dif[fail[x]])g[x]=add(g[x],g[fail[x]]);
if(i%2==0)dp[i]=add(dp[i],g[x]);// ở số chẵn vị trí đổi mới dp số tổ
}
}
printf("%d",dp[n]);
return0;
}

Ví dụ mẫu

Tương quan tư liệu