zoukankan      html  css  js  c++  java
  • P3649[APIO2014]回文串(回文自动机)

    给你一个由小写拉丁字母组成的字符串 ss。我们定义 ss 的一个子串的存在值为这个子串在 ss 中出现的次数乘以这个子串的长度。

    对于给你的这个字符串 ss,求所有回文子串中的最大存在值。

    PAM练习题。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=3e5+100;
    int sz,tot,lst,ch[maxn][26],cnt[maxn],len[maxn],fail[maxn];
    string s;
    char ps[maxn];
    struct PAM {
    	int node (int x) {
    		sz++;
    		memset(ch[sz],0,sizeof(ch[sz]));
    		len[sz]=x;
    		fail[sz]=cnt[sz]=0;
    		return sz;
    	}
    	void init () {
    		sz=-1;
    		lst=0;
    		ps[tot=0]='$';
    		node(0);
    		node(-1);
    		fail[0]=1;
    	}
    	int getFail (int x) {
    		while (ps[tot-len[x]-1]!=ps[tot]) x=fail[x];
    		return x;
    	}
    	void ins (char c) {
    		ps[++tot]=c;
    		int u=getFail(lst);
    		if (!ch[u][c-'a']) {
    			int x=node(len[u]+2);
    			fail[x]=ch[getFail(fail[u])][c-'a'];
    			ch[u][c-'a']=x;
    		}
    		lst=ch[u][c-'a'];
    		cnt[lst]++;
    	}
    }pam; 
    int main () {
    	pam.init();
    	cin>>s;
    	for (char c:s) pam.ins(c);
    	long long ans=0;
    	for (int i=sz;i>=0;i--) cnt[fail[i]]+=cnt[i];
    	for (int i=1;i<=sz;i++) ans=max(ans,1ll*len[i]*cnt[i]);
    	printf("%lld
    ",ans);
    }
  • 相关阅读:
    TCP/IP三次握手四次挥手
    注解(JDK1.5之后)
    枚举(JDK1.5之后)
    局部内部类
    非静态内部类
    静态内部类
    匿名内部类
    接口
    根父类:java.lang.Object
    native关键字
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/15072293.html
Copyright © 2011-2022 走看看