每个 subtask 错一个点就离谱。
思路就是建一颗 PAM 然后让另一个和它匹配。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int len[N],nex[N],max1=0,b[N],tr[N][30],now,n,m,tot=1,ans=1;
char st[N];
int get(int x,int i){
while(i-len[x]<2||st[i-len[x]-1]!=st[i])x=nex[x];
return x;
}
void build(){
nex[0]=1,len[0]=-1;
for(int i=1;i<=n;i++){
int t=get(now,i),bit=st[i]-'a';
if(!tr[t][bit]){
nex[++tot]=tr[get(nex[t],i)][bit];
tr[t][bit]=tot;
len[tot]=len[t]+2;
}
now=tr[t][bit];
}
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",st+1);
build();
now=1;
scanf("%s",st+1);
for(int i=1;i<=m;i++){
int bit=st[i]-'a';
while(now^1&&(st[i]!=st[i-len[now]-1]||!tr[now][bit]))now=nex[now];
now=tr[now][bit];
if(b[now])continue;
b[now]=1;
if(len[now]>max1)max1=len[now],ans=1;
else if(len[now]==max1)ans++;
}
printf("%d %d",max1,ans);
}