事件经过:在本题中,我的测试点一显示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;
}