| 比赛 |
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;
}