代码暂存

代码暂存,第1张

概述1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 3e5 + 5; 4 #define ll long long 5 struct Tree 6 { 7 int len, fail, go[26];//Go边指向添加字符后达到的状态,fail边指向当前状态字符串的最长回文后缀,类似

 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 3e5 + 5; 4 #define ll long long 5 struct Tree 6 { 7     int len,fail,go[26];//Go边指向添加字符后达到的状态,fail边指向当前状态字符串的最长回文后缀,类似于SAM 8 }tr[maxn]; 9 char s[maxn];10 int len,last,tot,Nowi,cnt[maxn];//Cnt[i]表示状态i在母串中出现的次数11 voID init()12 {13     tr[0].len = 0,tr[1].len = -1;14     tot = 1,last = 0;15     tr[0].fail = 1;16     Nowi=0;17 }18 int get(int Now)19 {20     while (s[Nowi - tr[Now].len - 1] != s[Nowi]) Now = tr[Now].fail;21     return Now;22 }23 voID add(int c)24 {25     Nowi++;26     int t = get(last);27     if (!tr[t].go[c])28     {29         tr[++ tot].len = tr[t].len + 2;30         tr[tot].fail = tr[get(tr[t].fail)].go[c];31         tr[t].go[c] = tot;32     }33     last = tr[t].go[c];34     cnt[last] ++;35 }36 ll getans()37 {38     ll ans = 0;39     for (int i = tot; i > 1; i --)40     {41         cnt[tr[i].fail] += cnt[i];42         ans = max(ans,1LL*tr[i].len*cnt[i]);43     }44     return ans;45 }46 int main()47 {48     scanf("%s",s + 1);49     len = strlen(s + 1);50     init();51     for (int i = 1; i <= len; i ++) add(s[i] - a);52     printf("%lld",getans());53 }
VIEw Code 总结

以上是内存溢出为你收集整理的代码暂存全部内容,希望文章能够帮你解决代码暂存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223068.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存