题目链接:Click here~~
题意:
给你一个lrc歌词文件,文件中,每行前面是若干个时间标签,当当前时间大于等于此标签且小于其他时间标签时,输出此行歌词。
然后给你一个时间,输出这个时间应该输出的歌词。
解题思路:
从这个时间向前找,直到找到某个时间在标签中出现过,然后输出所在标签的歌词。
由于时间格式特点,我们可以用一个int型变量储存它的状态i。
然后用一维数组tim[i]记录这个时间应该输出的歌词的序号。
细心些就好了。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 200
char str[N][2000];
char tim[1000005];
int loc[N],h,m,s;
bool judge(char *S)
{
if(*S!='[')
return 0;
for(int i=1;i<=2;i++)
if(!isdigit(*(S+i)))
return 0;
if(*(S+3)!=':')
return 0;
for(int i=4;i<=5;i++)
if(!isdigit(*(S+i)))
return 0;
if((*(S+4)-'0')*10 + (*(S+5)-'0')>=60)
return 0;
if(*(S+6)!='.')
return 0;
for(int i=7;i<=8;i++)
if(!isdigit(*(S+i)))
return 0;
if(*(S+9)!=']')
return 0;
return 1;
}
int to(int a,int b,int c)
{
return a*10000 + b*100 + c;
}
void div(int id,char *S)
{
int len = 0;
while(judge(S+len))
{
sscanf(S+len,"[%d:%d.%d]",&h,&m,&s);
tim[to(h,m,s)] = id;
len += 10;
}
loc[id] = len;
}
int main()
{
int n,Q,ans;
strcpy(str[0],"**************");
while(~scanf("%d%d%*c",&n,&Q))
{
memset(tim,0,sizeof(tim));
for(int i=1;i<=n;i++)
{
gets(str[i]);
div(i,str[i]);
}
while(Q--)
{
ans = 0;
scanf("%s",str[n+1]);
sscanf(str[n+1],"%d:%d.%d",&h,&m,&s);
for(;h>=0;h--)
{
for(;m>=0;m--)
{
for(;s>=0;s--)
{
int x = tim[to(h,m,s)];
if(x != 0)
{
ans = x;
goto end;
}
}
s = 99;
}
m = 59;
}
end: for(int j=loc[ans];str[ans][j];j++)
putchar(str[ans][j]);
putchar('\n');
}
}
return 0;
}