【JSOI2013】快乐的JYY PAM

在一个PAM跑另一个字符串

#include <bits/stdc++.h>
using namespace std;
#define fo(i,j,k) for(int i=(j),end_i=(k);i<=end_i;i++)
#define ff(i,j,k) for(int i=(j),end_i=(k);i< end_i;i++)
#define fd(i,j,k) for(int i=(j),end_i=(k);i>=end_i;i--)
#define DEBUG(x) cerr<<#x<<"="<<x<<endl
#define DEBUGv(x) cerr<<#x<<" : "; ff(i,0,(x).size()) cerr<<(x)[i]<<(i==(x).size()-1?'\n':' ')
#define all(x) (x).begin(),(x).end()
#define cle(x) memset(x,0,sizeof(x))
#define lowbit(x) ((x)&-(x))
#define VI vector<int>
#define ll long long
#define ull unsigned ll
#define lll __int128
#define db double
#define lb long db
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define endl "\n"
template<class T>inline void read(T &x) {
    x=0; char ch=getchar(); bool f=0;
    for(;ch<'0'||ch>'9';ch=getchar()) f|=(ch=='-');
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+(ch^48);
    if(f) x=-x;
}
template<class T, class... V>
inline void read(T &a, V&... b){read(a); read(b...);}
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int N = 5e5 + 5;
const int S = 26;

namespace PAM {
	int n,s[N],num[N],p,las,nex[N][S],fail[N],len[N],sz[N];
    ll ans;
    int cnt[N];
    int f[N][19];
    int ans2; 
    
    void add(int x, int y) {
        cnt[y] = cnt[x];
        int cha=len[y]-len[x];
        if(len[y]%4==0 && (len[y]/2)%cha==0 && cha<=len[y]/2 && y>=3) 
		{
			cnt[y]++;
			ans2=max(len[y],ans2);
		}
    }
	void init() {
        ans = 0;
        ans2 = 0;
		for(int i=0;i<=n;i++) s[i]=0;
		for(int i=1;i<=p;i++) len[i]=fail[i]=sz[i]=0,memset(nex[i],0,sizeof(nex[i])),memset(f[i],0,sizeof(f[i])), cnt[i]=0;
		s[n=0]=len[p=2]=-1;
		fail[las=1]=fail[2]=2;
        len[1]=0;
        add(2,0);
        add(2,1);
	}
	int getfail(int x) {for(;s[n-1-len[x]]!=s[n];x=fail[x]); return x;}
    void update(int x) {
        ans += cnt[x];
    }
	void add(int c) {
		s[++n]=c;
		int cur=getfail(las);
		if(!nex[cur][c]) {
			len[++p]=len[cur]+2;
			fail[p]=nex[getfail(fail[cur])][c];
			if(!fail[p]) fail[p]=1;
			nex[cur][c]=p;
            add(fail[p], p);
		}
		las=nex[cur][c];
		sz[las]++;
        update(las);
	}
    ll ask() {
        return len[p];
    }
}
char s[N];
int a[N];
void Solve() {
    int ans=0;
	PAM::init();
    int n;
    scanf("%d",&n);
    scanf("%s", s+1);
    fo(i,1,n) {
        PAM::add(s[i] - 'A');
        a[i]=PAM::ask();
    }
    scanf("%s",s+1);
    PAM::init();
    for(int i=1;i<=n;i++)
    cout<<a[i]<<' ';
    for(int i=n;i>=1;i--){
        PAM::add(s[i] - 'A');
        a[i]+=PAM::ask();
        ans=max(a[i],ans);
    }
    for(int i=1;i<=n;i++)
    cout<<a[i]<<' ';
    printf("%d",ans);
    
}
int main() {
    int T = 1;
    int n;
    //read(n);
    for(;T--;) Solve();
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define fo(i,j,k) for(int i=(j),end_i=(k);i<=end_i;i++)
#define ff(i,j,k) for(int i=(j),end_i=(k);i< end_i;i++)
#define fd(i,j,k) for(int i=(j),end_i=(k);i>=end_i;i--)
#define DEBUG(x) cerr<<#x<<"="<<x<<endl
#define DEBUGv(x) cerr<<#x<<" : "; ff(i,0,(x).size()) cerr<<(x)[i]<<(i==(x).size()-1?'\n':' ')
#define all(x) (x).begin(),(x).end()
#define cle(x) memset(x,0,sizeof(x))
#define lowbit(x) ((x)&-(x))
#define VI vector<int>
#define ll long long
#define ull unsigned ll
#define lll __int128
#define db double
#define lb long db
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define endl "\n"
template<class T>inline void read(T &x) {
    x=0; char ch=getchar(); bool f=0;
    for(;ch<'0'||ch>'9';ch=getchar()) f|=(ch=='-');
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+(ch^48);
    if(f) x=-x;
}
template<class T, class... V>
inline void read(T &a, V&... b){read(a); read(b...);}
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int N = 5e5 + 5;
const int S = 26;

namespace PAM {
	int n,s[N],num[N],p,las,nex[N][S],fail[N],len[N],sz[N];
    ll ans;
    int cnt[N];
    int f[N][19];
    int ans2; 
    
    void add(int x, int y) {
        cnt[y] = cnt[x];
        int cha=len[y]-len[x];
        if(len[y]%4==0 && (len[y]/2)%cha==0 && cha<=len[y]/2 && y>=3) 
		{
			cnt[y]++;
			ans2=max(len[y],ans2);
		}
    }
	void init() {
        ans = 0;
        ans2 = 0;
		for(int i=0;i<=n;i++) s[i]=0;
		for(int i=1;i<=p;i++) len[i]=fail[i]=sz[i]=0,memset(nex[i],0,sizeof(nex[i])),memset(f[i],0,sizeof(f[i])), cnt[i]=0;
		s[n=0]=len[p=2]=-1;
		fail[las=1]=fail[2]=2;
        len[1]=0;
        add(2,0);
        add(2,1);
	}
	int getfail(int x) {for(;s[n-1-len[x]]!=s[n];x=fail[x]); return x;}
    void update(int x) {
        ans += cnt[x];
    }
	void add(int c) {
		s[++n]=c;
		int cur=getfail(las);
		if(!nex[cur][c]) {
			len[++p]=len[cur]+2;
			fail[p]=nex[getfail(fail[cur])][c];
			if(!fail[p]) fail[p]=1;
			nex[cur][c]=p;
            add(fail[p], p);
		}
		las=nex[cur][c];
		sz[las]++;
        update(las);
	}
    ll ask() {
        return len[p];
    }
}
char s[N];
int a[N];
void Solve() {
    int ans=0;
	PAM::init();
    int n;
    scanf("%d",&n);
    scanf("%s", s+1);
    fo(i,1,n) {
        PAM::add(s[i] - 'A');
        a[i]=PAM::ask();
    }
    scanf("%s",s+1);
    PAM::init();
    for(int i=1;i<=n;i++)
    cout<<a[i]<<' ';
    for(int i=n;i>=1;i--){
        PAM::add(s[i] - 'A');
        a[i]+=PAM::ask();
        ans=max(a[i],ans);
    }
    for(int i=1;i<=n;i++)
    cout<<a[i]<<' ';
    printf("%d",ans);
    
}
int main() {
    int T = 1;
    int n;
    //read(n);
    for(;T--;) Solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值