比赛 NOIP2025模拟赛2 评测结果 AAAAAAAAAAAAAAAA
题目名称 回文块 最终得分 100
用户昵称 djyqjy 运行时间 1.712 s
代码语言 C++ 内存使用 83.73 MiB
提交时间 2025-11-25 11:49:36
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pir pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
const int N=5000010,SZ=133,MOD=1e9+7;
int T,n;
int ans;
char c[N];
ll hx[N];
ull hx2[N];
void init()
{
    for(int i=1;i<=n;i++)
    {
        hx[i]=(hx[i-1]*SZ+c[i])%MOD;
        hx2[i]=(hx2[i-1]*SZ+c[i]);
    }
    return;
}
ll qpow[N];
ull qpow2[N];
ll hs(int l,int r)
{
    return (hx[r]-hx[l-1]*qpow[r-l+1]%MOD+MOD*3ll)%MOD;
}
ull hs2(int l,int r)
{
    return hx2[r]-hx2[l-1]*qpow2[r-l+1];
}
void solve(int l,int r)
{
    // cout<<l<<' '<<r<<endl;
    if(l>r) return;
    for(int i=l,j=r;i<j;i++,j--)
    {
        if(hs(l,i)==hs(j,r)&&hs2(l,i)==hs2(j,r))
        {
            ans+=2;
            solve(i+1,j-1);
            return;
        }
    }
    ans++;
    return;
}
int main()
{
    freopen("palin.in","r",stdin);
    freopen("palin.out","w",stdout);
    qpow[0]=qpow2[0]=1;
    for(int i=1;i<=5000005;i++)
    {
        qpow[i]=qpow[i-1]*SZ%MOD;
        qpow2[i]=qpow2[i-1]*SZ;
    }
    T=re();
    while(T--)
    {
        ans=0;
        scanf("%s",c+1);n=strlen(c+1);
        init();
        solve(1,n);
        printf("%d\n",ans);
    }
    return 0;
}