#include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX_MRO 300000 #define GO_LEFT 'L' #define GO_RIGHT 'P' size_t len; char mro_0[MAX_MRO]; char mro_1[MAX_MRO]; char *mro = mro_0; char *next = mro_1; int ping[MAX_MRO]; const char *test = "LPPLPL"; const char* n = "6"; int main(int argc, char **argv) { size_t i, j; len = atol((argc > 1) ? argv[1] : n); if (len > MAX_MRO) return -1; memcpy(mro, (argc > 2) ? argv[2] : test, sizeof(mro)); memset(ping, 0, sizeof(ping)); i = 0; j = len - 1; do { if (mro[i] == GO_LEFT) i++; if (mro[j] == GO_RIGHT) j--; for (size_t p = i; p <= j; p++) { if (mro[p] != mro[p + 1]) { ping[p]++; next[p] = (mro[p] == GO_RIGHT) ? GO_LEFT : GO_RIGHT; } else { next[p] = mro[p]; } } char* t = mro; mro = next; next = t; } while (i < j); for (size_t p = 0; p < len; p++) printf("%d ", ping[p]); printf("\r\n"); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <stdlib.h> #include <stdio.h> #include <string.h> #define MAX_MRO 300000 #define GO_LEFT 'L' #define GO_RIGHT 'P' size_t len; char mro_0[MAX_MRO]; char mro_1[MAX_MRO]; char *mro = mro_0; char *next = mro_1; int ping[MAX_MRO]; const char *test = "LPPLPL"; const char* n = "6"; int main(int argc, char **argv) { size_t i, j; len = atol((argc > 1) ? argv[1] : n); if (len > MAX_MRO) return -1; memcpy(mro, (argc > 2) ? argv[2] : test, sizeof(mro)); memset(ping, 0, sizeof(ping)); i = 0; j = len - 1; do { if (mro[i] == GO_LEFT) i++; if (mro[j] == GO_RIGHT) j--; for (size_t p = i; p <= j; p++) { if (mro[p] != mro[p + 1]) { ping[p]++; next[p] = (mro[p] == GO_RIGHT) ? GO_LEFT : GO_RIGHT; } else { next[p] = mro[p]; } } char* t = mro; mro = next; next = t; } while (i < j); for (size_t p = 0; p < len; p++) printf("%d ", ping[p]); printf("\r\n"); return 0; } |