APIO2014 回文串

本文介绍了一种使用回文树的数据结构来解决特定字符串问题的方法。通过构建回文树,可以高效地统计字符串中所有回文子串出现的次数,并利用这些信息找出最优解。文章详细展示了如何初始化树结构、添加字符更新树状态以及最后统计结果的过程。

建回文树。

cnt*len取max。

By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=3e5+5;
 4 const int M=26;
 5 typedef long long ll;
 6 struct Palindromic_Tree{
 7     int nex[N][M];
 8     int fail[N];
 9     int cnt[N];
10     int num[N];
11     int len[N];
12     int S[N];
13     int last;
14     int n;
15     int p;
16     
17     int newnode(int l)
18     {
19         for(int i=0;i<M;++i)nex[p][i]=0;
20         cnt[p]=0;
21         num[p]=0;
22         len[p]=l;
23         return p++;
24     }
25     
26     void init()
27     {
28         p=0;
29         newnode(0);
30         newnode(-1);
31         last=0;
32         n=0;
33         S[n]=-1;
34         fail[0]=1;
35     }
36     
37     int get_fail(int x){
38         while(S[n-len[x]-1]!=S[n])x=fail[x];
39         return x;
40     }
41     
42     void add(int c){
43         c-='a';
44         S[++n]=c;
45         int cur=get_fail(last);
46         if(!nex[cur][c]){
47             int now=newnode(len[cur]+2);
48             fail[now]=nex[get_fail(fail[cur])][c];
49             nex[cur][c]=now;
50             num[now]=num[fail[now]]+1;
51         }
52         last=nex[cur][c];
53         cnt[last]++;
54     }
55     
56     long long count(){
57         long long ans=0;
58         for(int i=p-1;i>=0;--i)cnt[fail[i]]+=cnt[i],ans=max(ans,1ll*cnt[i]*len[i]);
59         return ans;
60     }
61 }T;
62 char s[N];
63 int main()
64 {
65     scanf("%s",s);
66     int n=strlen(s);
67     T.init();
68     for(int i=0;i<n;++i)
69     {
70         T.add(s[i]);
71     }
72     printf("%lld",T.count());
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8261024.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值