蒟蒻求助,5分
查看原帖
蒟蒻求助,5分
98490
houzhiyuan楼主2022/2/13 08:11

每个 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);
}
2022/2/13 08:11
加载中...