返回信息流#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;
}
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92074同步于 2017/3/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【问题】新人求指导,改了好久还是运行错误,oj94题
gungnir0123
2017/3/6镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 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,你需要求出相应的距离。
自己改了之后,又说是答案错误,真不知道是哪里不对[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 的大作中提到: 】
: memset只能置0或者-1,其他值无效。
我看了一下,dp数组可以不会初始化,我删了之后,程序提交还是答案错误,在自己的机器实在是检查不出来了,求看看,我哪里的考虑不对
【 在 yl136642476 的大作中提到: 】
: 如果自己的样例都没问题的话 可能是有些特殊情况没考虑到吧
: :
你之前做过吗?做过的话能给我几组测试用例吗?[em71]