关于我证明了8=0这件事
查看原帖
关于我证明了8=0这件事
552811
lzx390楼主2024/11/27 10:56

事件经过:在本题中,我的测试点一显示line12,read 0,expected 8.但当我下载测试点在本机跑的时候,line12又输出8了???并且fc了所有阳历和第一个点都找不到差异???

#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
#define int long long
using namespace std;
const int N=110;
struct typ{int maxn,ecnt,ty[N],beg[N],len;char nam[N][N];}str[N];
struct element{int ty,beg;char nam[N];}ele[N];
map<ull,int> mp;
int n,strcnt,elecnt,rev[4]={1,2,4,8};
int chkty(char s[]){
	if(s[0]=='b' && s[1]=='y' && s[2]=='t' && s[3]=='e') return 101;
	if(s[0]=='s' && s[1]=='h' && s[2]=='o' && s[3]=='r' && s[4]=='t') return 102;
	if(s[0]=='i' && s[1]=='n' && s[2]=='t') return 103;
	if(s[0]=='l' && s[1]=='o' && s[2]=='n' && s[3]=='g') return 104;
	return 0;
}
bool chkname(char s1[],char s2[]){
	int l1=strlen(s1),l2=strlen(s2);
	if(l1!=l2) return 0;
	for(int i=0;i<l1;i++) if(s1[i]!=s2[i]) return 0;
	return 1;
}
void newstr(){
	int k,len,len1,len2;ull hx=0;char s[N],s1[N],s2[N];
	scanf("%s",s+1);len=strlen(s+1);
	for(int i=1;i<=len;i++) hx=hx*13331+(ull)(s[i]-'a'+1);
	mp[hx]=++strcnt;
	str[strcnt].ecnt=str[strcnt].maxn=0;
	scanf("%d",&k);
	for(int i=1;i<=k;i++){
		scanf("%s",s1);scanf("%s",s2);
		len1=strlen(s1);len2=strlen(s2);hx=0;
		str[strcnt].ecnt++;
		for(int j=0;j<len2;j++) str[strcnt].nam[str[strcnt].ecnt][j]=s2[j];
		int t=chkty(s1);
		if(t){
			str[strcnt].ty[str[strcnt].ecnt]=t;
			str[strcnt].maxn=max(str[strcnt].maxn,rev[t-101]);
		}
		else{
			for(int j=0;j<len1;j++) hx=hx*13331+(ull)(s1[j]-'a'+1);
			str[strcnt].ty[str[strcnt].ecnt]=mp[hx];
			//printf("%d\n",mp[hx]);
			str[strcnt].maxn=max(str[strcnt].maxn,str[mp[hx]].maxn);
		}
		if(str[strcnt].ecnt==1) str[strcnt].beg[str[strcnt].ecnt]=0;
		else{
			int pre=str[strcnt].ecnt-1,nw=str[strcnt].ecnt,duinw=str[str[strcnt].ty[nw]].maxn;
			//printf("%d %d %d %d %d\n",pre,nw,str[strcnt].ty[pre],str[str[strcnt].ty[pre]].len,duinw);
			str[strcnt].beg[nw]=(str[strcnt].beg[pre]+str[str[strcnt].ty[pre]].len-1)/duinw*duinw+duinw;
		}
		//printf("%d %d\n",str[strcnt].ty[str[strcnt].ecnt],str[strcnt].beg[str[strcnt].ecnt]);
	}
	str[strcnt].beg[str[strcnt].ecnt+1]=1e18+1;
	int pre=str[strcnt].ecnt,duinw=str[strcnt].maxn;
	str[strcnt].len=(str[strcnt].beg[pre]+str[str[strcnt].ty[pre]].len-1)/duinw*duinw+duinw;
	printf("%lld %lld\n",str[strcnt].len,str[strcnt].maxn);
	return;
}
void newele(){
	char s1[N],s2[N];
	scanf("%s",s1);scanf("%s",s2);
	int len1=strlen(s1),len2=strlen(s2);
	elecnt++;
	for(int i=0;i<len2;i++) ele[elecnt].nam[i]=s2[i];
	int t=chkty(s1);ull hx=0;
	if(t) ele[elecnt].ty=t;
	else{
		for(int i=0;i<len1;i++) hx=hx*13331+(ull)(s1[i]-'a'+1);
		ele[elecnt].ty=mp[hx];
	}
	if(elecnt==1) ele[elecnt].beg=0;
	else{
		int pre=ele[elecnt-1].beg,duinw=str[ele[elecnt].ty].maxn;
		//printf("%lld %d %d\n",pre,ele[elecnt].ty,duinw);
		ele[elecnt].beg=(pre+str[ele[elecnt-1].ty].len-1)/duinw*duinw+duinw;
	}
	printf("%lld\n",ele[elecnt].beg);
	return;
}
void askele(){
	int ans=0,lens1=0,p=0;
	char s[N],s1[N];
	scanf("%s",s);
	int len=strlen(s);
	for(int i=0;i<len;i++){
		if(s[i]!='.' && i!=len-1) {s1[lens1++]=s[i];continue;}
		if(i==len-1) s1[lens1++]=s[i];
		if(!p){
			for(int j=1;j<=elecnt;j++){
				if(chkname(s1,ele[j].nam)){
					ans+=ele[j].beg;
					p=ele[j].ty;break;
				}
			}
		}
		else{
			for(int j=1;j<=str[p].ecnt;j++)
				if(chkname(s1,str[p].nam[j])){
					ans+=str[p].beg[j];
					p=str[p].ty[j];break;
				}
		}
		for(int j=0;j<lens1;j++) s1[j]=0;
		lens1=0;
	}
	printf("%lld\n",ans);
	return;
}
void askpl(){
	int qsum,lenans=0,p=0;
	char ans[N];
	scanf("%lld",&qsum);
	while(qsum>0){
		if(!p){
			for(int j=1;j<=elecnt;j++)
				if(qsum<ele[j+1].beg){
					int ll=strlen(ele[j].nam);
					for(int k=0;k<ll;k++) ans[lenans++]=ele[j].nam[k];
					if(ele[j].ty<=100) ans[lenans++]='.';
					qsum-=ele[j].beg;p=ele[j].ty;break;
				}
			if(!p) {printf("ERR\n");return;}
		}
		else
			for(int j=1;j<=str[p].ecnt;j++)
				if(qsum<str[p].beg[j+1]){
					int ll=strlen(str[p].nam[j]);
					for(int k=0;k<ll;k++) ans[lenans++]=str[p].nam[j][k];
					if(str[p].ty[j]<=100) ans[lenans++]='.';
					qsum-=str[p].beg[j];p=str[p].ty[j];
					break;
				}
		if(p>100){
			if(qsum>=str[p].len) printf("ERR");
			else 
			{
				for(int i=0;i<lenans;i++) printf("%c",ans[i]);
			}
			printf("\n");return;
		}
	}
	printf("ERR\n");
	return;
}
signed main(){
	//freopen("struct.in","r",stdin);
	//freopen("struct.out","w",stdout);
	str[101].len=1;str[102].len=2;str[103].len=4;str[104].len=8;
	str[101].maxn=1;str[102].maxn=2;str[103].maxn=4;str[104].maxn=8;
	for(int i=1;i<=100;i++) ele[i].beg=1e18+1;
	scanf("%lld",&n);
	for(int i=1,op;i<=n;i++){
		scanf("%lld",&op);
		if(op==1) newstr();
		if(op==2) newele();
		if(op==3) askele();
		if(op==4) askpl();
	}
	return 0;
}
2024/11/27 10:56
加载中...