感觉复杂度在 5 秒内能跑过去,但是实际 TLE#9,并且显示的是 return code -1,所以怀疑是哪里 RE 了,但是又找不出来问题(CF 没给我显示)。求大佬指点。
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=5e4+10;
const int maxm=4e5+10;
const int inf=1e9;
int n,N,m,x,y;
int app[maxn];
int head[maxm],to[maxm],nxt[maxm],ver[maxm],tot;
char s[maxn];
priority_queue<pii> q;
int dis[910][maxn+910],vis[maxn+910];
inline int ID(int i)//空隙的权值
{
return (s[i]-'a')*26+(s[i+1]-'a');
}
inline void add(int x,int y,int z)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
ver[tot]=z;
}
inline void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
while(!q.empty())q.pop();
dis[s-N][s]=0;
q.push(mp(0,s));
while(!q.empty())
{
int x=q.top().se;q.pop();
if(vis[x])continue;
vis[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dis[s-N][y]>dis[s-N][x]+ver[i])
{
dis[s-N][y]=dis[s-N][x]+ver[i];
q.push(mp(-dis[s-N][y],y));
}
}
}
}
int main()
{
scanf("%s",s+1);
n=strlen(s+1);N=n+1;
for(int i=1;i<=n-1;i++)
{
add(i,i+1,2);
add(i+1,i,2);//边权扩倍
}
for(int i=1;i<=n-1;i++)
{
add(ID(i)+N,i,1);//连虚点
add(i,ID(i)+N,1);
app[ID(i)]=1;
}
memset(dis,0x3f,sizeof(dis));
for(int i=0;i<=26*26;i++)if(app[i])dijkstra(i+N);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&x,&y);
int ans=abs(x-y);
for(int i=0;i<=26*26;i++)if(app[i])ans=min(ans,(dis[i][x]+dis[i][y])>>1);
printf("%d\n",ans);
}
return 0;
}