数组开大为什么会TLE
查看原帖
数组开大为什么会TLE
302750
Main_WF楼主2022/7/14 08:57

看了题解后自己写了代码,一直TLE4个点,于是一点点对照题解改。最后反复测评发现错因竟然是d[]数组开大了,不是很理解。 AC代码(看了题解1的):``` #include #include #include #define re register using namespace std;

const int maxn=3e4+10; const int maxm=3e5+10; string s[maxn],ans[maxn]; int d[26],cnt; bool e[26][26],book[maxn]; queueq;

struct Trie{ int node[maxm][26],wd[maxm],tot=1; inline void topo() { for(;!q.empty();)q.pop(); for(re int i=0;i<=25;i++) if(!d[i]) q.push(i); for(;!q.empty();) { int u=q.front(); q.pop(); for(re int i=0;i<=25;i++) if(e[u][i])//简化 if(!(--d[i])) q.push(i); } } inline void insert(string s) { int u=1;int len=s.length(); for(re int i=0;i<len;i++) { int v=s[i]-'a'; if(!node[u][v]) node[u][v]=++tot; u=node[u][v]; } wd[u]=1; } inline bool find(string s) { memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); int u=1;int len=s.length(); for(re int i=0;i<len;i++) { if(wd[u])return 0; int v=s[i]-'a'; for(re int j=0;j<=25;j++) if(j!=v&&node[u][j]&&!e[v][j]) e[v][j]=1,d[j]++; u=node[u][v]; } topo(); for(re int i=0;i<=25;i++) if(d[i]) return 0; return 1; } }tr;

int main() { int n;cin>>n; for(re int i=1;i<=n;i++) { cin>>s[i]; tr.insert(s[i]); } for(re int i=1;i<=n;i++) if(tr.find(s[i])) { cnt++; book[i]=1; } cout<<cnt<<'\n'; for(re int i=1;i<=n;i++) if(book[i])cout<<s[i]<<'\n'; }

TLE代码:

#include #include #include #define re register using namespace std;

const int maxn=3e4+10; const int maxm=3e5+10; string s[maxn],ans[maxn]; int d[maxm],cnt;//TLE所在 bool e[26][26],book[maxn]; queueq;

struct Trie{ int node[maxm][26],wd[maxm],tot=1; inline bool topo() { for(;!q.empty();)q.pop(); for(re int i=0;i<=25;i++) if(!d[i]) q.push(i); for(;!q.empty();) { int u=q.front(); q.pop(); for(re int i=0;i<=25;i++) if(e[u][i]) { e[u][i]=0;//不需要删边,因为队列中的点入度为0,没有边能访问到它 if(!(--d[i])) q.push(i); }

	}
	for(re int i=0;i<=25;i++)
		if(d[i])
			return 0;
	return 1;
}
inline void insert(string s) 
{
	int u=1;int len=s.length();
	for(re int i=0;i<len;i++) 
	{
		int v=s[i]-'a';
		if(!node[u][v])
			node[u][v]=++tot;
		u=node[u][v];
	}
	wd[u]=1;
}
inline bool find(string s)
{
	memset(d,0,sizeof(d));
	memset(e,0,sizeof(e));
	int u=1;int len=s.length();
	for(re int i=0;i<len;i++)
	{
		if(wd[u])return 0;
		int v=s[i]-'a';
		for(re int j=0;j<=25;j++)
			if(j!=v&&node[u][j]&&!e[v][j])
				e[v][j]=1,d[j]++;
		u=node[u][v];
	}
	return topo();
}

}tr;

int main() { int n;cin>>n; for(re int i=1;i<=n;i++) { cin>>s[i]; tr.insert(s[i]); } for(re int i=1;i<=n;i++) if(tr.find(s[i])) { cnt++; book[i]=1; } cout<<cnt<<'\n'; for(re int i=1;i<=n;i++) if(book[i])cout<<s[i]<<'\n'; }

2022/7/14 08:57
加载中...