在一个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;
}