社区讨论

神秘RE变AC求解释。

P4683[IOI 2008] Type Printer参与者 4已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mlkp9cic
此快照首次捕获于
2026/02/13 17:43
6 天前
此快照最后确认于
2026/02/16 19:55
3 天前
查看原帖
代码1CPP
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int rt=0,cnt=0,tr[N][30],ansn;
bool ed[N],t[N];
string s[N];
char ans[N];//这里
void dfs(int k){
	if(ed[k])ans[++ansn]='P';//这里
	for(int i=0;i<26;i++)
	if(tr[k][i] && !t[tr[k][i]]){
		ans[++ansn]=i+'a'//这里;
		dfs(tr[k][i]);
		ans[++ansn]='-';//这里
	}
	for(int i=0;i<26;i++)
	if(tr[k][i] && t[tr[k][i]]){
		ans[++ansn]=i+'a';//这里
		dfs(tr[k][i]);
	}
}
int main(){
	int n,mxl=0,mx;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		cin>>s[i];
		int l=s[i].size();
		mxl=max(mxl,l);
	}mx=mxl;
	for(int i=1;i<=n;i++){
		int l=s[i].size(),now=rt;
		for(int j=0;j<l;j++){
			int ch=s[i][j]-'a';
			if(!tr[now][ch])tr[now][ch]=++cnt;
			now=tr[now][ch];
		}ed[now]=1;
		if(l==mxl){
			now=rt;
			for(int j=0;j<l;j++){
				now=tr[now][s[i][j]-'a'];
				t[now]=1;
			}
			mxl=0;
		}
	}
	dfs(rt);
	printf("%d\n",ansn);//这里
	for(int i=1;i<=ansn;i++)//这里
		cout<<ans[i]<<endl;
	return 0;
}
代码2CPP
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int rt=0,cnt=0,tr[N][30],ansn;
bool ed[N],t[N];
string s[N];
vector<char> ans;//这里
void dfs(int k){
	if(ed[k])ans.push_back('P');//这里
	for(int i=0;i<26;i++)
	if(tr[k][i] && !t[tr[k][i]]){
		ans.push_back(i+'a');//这里
		dfs(tr[k][i]);
		ans.push_back('-');//这里
	}
	for(int i=0;i<26;i++)
	if(tr[k][i] && t[tr[k][i]]){
		ans.push_back(i+'a');//这里
		dfs(tr[k][i]);
	}
}
int main(){
	int n,mxl=0,mx;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		cin>>s[i];
		int l=s[i].size();
		mxl=max(mxl,l);
	}mx=mxl;
	for(int i=1;i<=n;i++){
		int l=s[i].size(),now=rt;
		for(int j=0;j<l;j++){
			int ch=s[i][j]-'a';
			if(!tr[now][ch])tr[now][ch]=++cnt;
			now=tr[now][ch];
		}ed[now]=1;
		if(l==mxl){
			now=rt;
			for(int j=0;j<l;j++){
				now=tr[now][s[i][j]-'a'];
				t[now]=1;
			}
			mxl=0;
		}
	}
	dfs(rt);
	printf("%d\n",ans.size());//这里
	for(int i=0;i<ans.size();i++) //这里
		printf("%c\n",ans[i]);
	return 0;
}
(先不说为什么错这么惨。)只把记答案的数组改成vector,为什么#19从RE变AC。

回复

10 条回复,欢迎继续交流。

正在加载回复...