题意:给你一个串,回文串有个价值,定义为回文串的长度乘以次数,求最大值
思路:偷一份模板,附聚聚
代码:
#includeusing namespace std;typedef long long LL;inline LL read(){ LL x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}const int maxn = 300010*2;const int ALP = 26;struct Palindromic_Tree{ ///init,把每个字符add进PAM中,最后做一次Count int next[maxn][ALP];//next指针,next指针和字典树类似,指向的串为当前串两端加上同一个字符构成 int fail[maxn];//fail指针,失配后跳转到fail指针指向的节点 int cnt[maxn]; //表示节点i表示的本质不同的串的个数(建树时求出的不是完全的,最后Count()函数跑一遍以后才是正确的) int num[maxn]; //表示以节点i表示的最长回文串的最右端点为回文串结尾的回文串个数 int len[maxn];//len[i]表示节点i表示的回文串的长度(一个节点表示一个回文串) int S[maxn];//存放添加的字符 int last;//指向新添加一个字母后所形成的最长回文串表示的节点。 int n;//表示添加的字符个数。 int p;//表示添加的节点个数。 int newnode(int l){ //新建节点 for(int i=0;i =0;--i)cnt[fail[i]]+=cnt[i]; //父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串! }}pam;char s[maxn];int main(){ scanf("%s",s); int len=strlen(s); pam.init(); for(int i=0;i