题目链接: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; }