1 16 111 1 110 1 101 1 100 1 011 1 010 0 001 1 000 0 0000000000000001000000000000000
0000000000000001000000000000000 0000000000000010100000000000000 0000000000000101010000000000000 0000000000001010101000000000000 0000000000010101010100000000000 0000000000101010101010000000000 0000000001010101010101000000000 0000000010101010101010100000000 0000000101010101010101010000000 0000001010101010101010101000000 0000010101010101010101010100000 0000101010101010101010101010000 0001010101010101010101010101000 0010101010101010101010101010100 0101010101010101010101010101010 1010101010101010101010101010101
老感觉我字符串掌握的不太好。。啥KMP,啥扩展KMP都不会。。唉,,做个水题,培养培养代码能力
AC代码(注意m<=1000, 每行乐谱长度<=200,题目也没说,导致我WA了一次。。):
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int col; char s[5]; }s1[8]; int a[1050][305]; int fun(int a[][305], int i, int j) { for(int k=0; k<8; k++) { if(s1[k].s[0]-'0' == a[i][j-1] && s1[k].s[1]-'0' == a[i][j] && s1[k].s[2]-'0' == a[i][j+1]) return s1[k].col; } } int main() { int t, m; scanf("%d", &t); while(t--) { scanf("%d", &m); for(int i=0; i<8; i++) scanf("%s %d", s1[i].s, &s1[i].col); getchar(); memset(a, 0, sizeof(a)); int count = 1; while(1) { char c = getchar(); if(c == '\n') break; a[1][count++] = c - '0'; } for(int i=1; i<m; i++) { for(int j=1; j<count; j++) { a[i+1][j] = fun(a, i, j); } } for(int i=1; i<=m; i++) { for(int j=1; j<count; j++) { printf("%d", a[i][j]); } printf("\n"); } } return 0; }