BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92074同步于 2017/3/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】新人求指导,改了好久还是运行错误,oj94题

gungnir0123
2017/3/6镜像同步8 回复
#include<stdio.h> #include<string.h> #include<math.h> #define Max 100001 int dp[Max],pos[26]; //pos保存目前s访问某个字符的最新下标,dp保存每个下标的最小距离 char s[Max]; int main() { int ncase,m,nul_num,index,k,slen,i; char c,operation[9]; // int (*zimushu)[100001]; scanf("%d",&ncase); while(ncase--) { memset(pos,-1,sizeof(pos)); memset(dp,Max,sizeof(dp)); scanf("%s",s); slen=strlen(s); for(i=0;i<slen;i++) { if(pos[s[i]-'a']==-1) { pos[s[i]-'a']=i; dp[i]=Max; } else if(abs(i-pos[s[i]-'a'])<dp[pos[s[i]-'a']]) { dp[pos[s[i]-'a']]=abs(i-pos[s[i]-'a']); dp[i]=abs(i-pos[s[i]-'a']); pos[s[i]-'a']=i; } } scanf("%d",&m); getchar(); while(m--) { nul_num=0; scanf("%s",operation); getchar(); scanf("%c",&c); if(strcmp(operation,"INSERT")==0) { s[slen]=c; if(pos[s[slen]-'a']==-1) { pos[s[slen]-'a']=slen; dp[slen]=Max; } else if(abs(slen-pos[s[slen]-'a'])<dp[pos[s[slen]-'a']]) { dp[pos[s[slen]-'a']]=abs(slen-pos[s[slen]-'a']); dp[slen]=abs(slen-pos[s[slen]-'a']); pos[s[slen]-'a']=slen; } slen++; s[slen]='\0'; } else if(strcmp(operation,"QUERY")==0) { index=c-48; if(dp[index]==Max) printf("-1\n"); else { printf("%d\n",dp[index]); } } } s[0]='\0'; } return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
lzj0218机器人#1 · 2017/3/6
能简单描述下题目吗? 发自「贵邮」
gungnir0123机器人#2 · 2017/3/6
【 在 lzj0218 的大作中提到: 】 : 能简单描述下题目吗? : 发自「贵邮」 这是原题的题目描述,担心自己说不清楚,所以贴过来了 给定一个由小写字母a到z组成的字符串S,其中第i个字符为S[i](下标从0开始)。你需要完成下面两个操作: INSERT c 其中c是一个待输入的字符。你需要在字符串的末尾添加这个字符。保证输入的字符同样是a到z之间的一个小写字母。 QUERY x 其中x是一个输入的整数下标。对于这个询问,你需要回答在S当中和S[x]相等且与x最近的距离。输入保证x在当前字符串中合法。 例如S = "abcaba",如果我们操作: INSERT a 则在S的末端加一个字符a,S变成"abcabaa"。 接下来操作 QUERY 0 由于S[0] = a,在S中出现的离他最近的a在下标为3的位置上,距离为3 - 0 = 3。因此应当输出3。 接下来,如果 QUERY 4 S[4] = b,S中离它最近的b出现在下标为1处,距离为4 - 1 = 3。同样应当输出3。 给定初始字符串S和若干操作,对于每个QUERY,你需要求出相应的距离。
gungnir0123机器人#3 · 2017/3/6
自己改了之后,又说是答案错误,真不知道是哪里不对[ema1] #include<stdio.h> #include<string.h> #include<math.h> #define Max 100005 int dp[Max],pos[26]; //pos保存目前s访问某个字符的最新下标,dp保存每个下标的最小距离 char s[Max]; int main() { int ncase,m,nul_num,index,k,slen,i; char c,operation[20]; scanf("%d",&ncase); while(ncase--) { memset(pos,-1,sizeof(pos)); memset(dp,Max,sizeof(dp)); scanf("%s",s); slen=strlen(s); for(i=0;i<slen;i++) { if(pos[s[i]-'a']==-1) { pos[s[i]-'a']=i; dp[i]=Max; } else if(abs(i-pos[s[i]-'a'])<dp[pos[s[i]-'a']]) { dp[pos[s[i]-'a']]=abs(i-pos[s[i]-'a']); dp[i]=abs(i-pos[s[i]-'a']); pos[s[i]-'a']=i; } } scanf("%d",&m); getchar(); while(m--) { nul_num=0; scanf("%s",operation); getchar(); if(strcmp(operation,"INSERT")==0) { scanf("%c",&c); s[slen]=c; if(pos[s[slen]-'a']==-1) { pos[s[slen]-'a']=slen; dp[slen]=Max; } else if(abs(slen-pos[s[slen]-'a'])<dp[pos[s[slen]-'a']]) { dp[pos[s[slen]-'a']]=abs(slen-pos[s[slen]-'a']); dp[slen]=abs(slen-pos[s[slen]-'a']); pos[s[slen]-'a']=slen; } slen++; s[slen]='\0'; } else if(strcmp(operation,"QUERY")==0) { scanf("%d",&index); if(dp[index]==Max) printf("-1\n"); else { printf("%d\n",dp[index]); } } } s[0]='\0'; } return 0; }
yl136642476机器人#4 · 2017/3/6
memset只能置0或者-1,其他值无效。
gungnir0123机器人#5 · 2017/3/6
【 在 yl136642476 的大作中提到: 】 : memset只能置0或者-1,其他值无效。 我看了一下,dp数组可以不会初始化,我删了之后,程序提交还是答案错误,在自己的机器实在是检查不出来了,求看看,我哪里的考虑不对
yl136642476机器人#6 · 2017/3/6
如果自己的样例都没问题的话 可能是有些特殊情况没考虑到吧 【 在 gungnir0123 的大作中提到: 】 :
gungnir0123机器人#7 · 2017/3/6
【 在 yl136642476 的大作中提到: 】 : 如果自己的样例都没问题的话 可能是有些特殊情况没考虑到吧 : : 你之前做过吗?做过的话能给我几组测试用例吗?[em71]
gungnir0123机器人#8 · 2017/3/6
做出来了,是自己一个括号括错了[ema9]