最后一个点MLE,不知道是为什么,vector有那么占空间吗,哪位大神能来解决一下
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+8;
vector<bool> a[N/2];
long long ans=0;
int n,m;
vector<int> res[N];//0横,1纵
char c[N];
inline void manacher(int n,int d,int op){//横向
int mid=0,r=0;
for(int i=1;i<=n*2+2;i++){
// cout<<"i="<<i<<'\n';
int dt;
if(r<i) dt=0;
else{
int mir=(mid*2)-i;
dt=r-i;
if(op==0) dt=min(dt,res[d][mir]);
else dt=min(dt,res[mir][d]);
}
while(c[i-dt]==c[i+dt]) dt++;
int to;
if(op==0) to=res[d][i]=dt-1;
else to=res[i][d]=dt-1;
if(i+to>r){
r=i+to;
mid=i;
}
}
}
vector<bool> vis[N];
int dx[6]={1,0,-1,0};
int dy[6]={0,1,0,-1};
struct node{
int x,y;
};
inline void bfs(int l,int r,int up,int dn){
queue<node> q;
for(int i=l;i<=r;i++){
for(int j=up;j<=dn;j++){
if(vis[i][j]||a[i][j]) continue;
ans++;
q.push(node{i,j});
while(!q.empty()){
int x=q.front().x,y=q.front().y;
q.pop();
vis[x][y]=1;
for(int k=0;k<4;k++){
int xx=x+dx[k],yy=y+dy[k];
if(xx<l||yy<up||xx>r||yy>dn) continue;
if(vis[xx][yy]) continue;
if(a[xx][yy]) continue;
vis[xx][yy]=1;
q.push(node{xx,yy});
}
}
}
}
}
inline void solve(){
ans=0;
int l=1,r=m;
int up=1,dn=n;
bool f0;
c[1]='$';
c[m*2+2]='#';
c[m*2+3]='@';
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[j*2]='#';
c[j*2+1]=a[i][j];
}
manacher(m,i,0);
}
for(int j=1;j<=m;j++){
f0=1;
for(int i=1;i<=n;i++){
if(j-res[i][j*2]/2>l){
f0=0;
break;
}
}
if(f0){
l=j;
}
}
for(int j=m;j>l;j--){
f0=1;
for(int i=1;i<=n;i++){
if(j+res[i][j*2]/2-1<r){
f0=0;
break;
}
}
if(f0){
r=j-1;
}
}
for(int i=1;i<=2*n+5;i++){res[i].clear();
vector<int>().swap(res[i]);
res[i].resize(m+2);
}
c[n*2+2]='#';
c[n*2+3]='@';
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
c[i*2]='#';
c[i*2+1]=a[i][j]+'0';
}
manacher(n,j,1);
}
for(int i=1;i<=n;i++){
f0=1;
for(int j=1;j<=m;j++){
if(i-res[i*2][j]/2>up){
f0=0;
break;
}
}
if(f0){
up=i;
}
}
for(int i=n;i>up;i--){
f0=1;
for(int j=1;j<=m;j++){
if(i+res[i*2][j]/2-1<dn){
f0=0;
break;
}
}
if(f0){
dn=i-1;
}
}
for(int i=1;i<=n*2+5;i++){
res[i].clear();
vector<int>().swap(res[i]);
}
// cout<<"border= "<<l<<' '<<r<<' '<<up<<' '<<dn<<'\n';
bfs(up,dn,l,r);
}
int main(){
int T;
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++){
a[i].resize(m+2);
vis[i].resize(m+2);
res[i].resize(2*m+5);
}
char ccc[N];
for(int i=1;i<=n;i++){
cin>>ccc+1;
for(int j=1;j<=m;j++) a[i][j]=ccc[j]-'0';
}
solve();
cout<<ans<<'\n';
for(int i=1;i<=n;i++){
a[i].clear();
vis[i].clear();
vector<bool>().swap(a[i]);
vector<bool>().swap(vis[i]);
}
}
return 0;
}