Untitled
unknown
c_cpp
5 months ago
2.5 kB
5
Indexable
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define ll long long #define SIZE 10005 #define ASCII_SIZE 126 + 5 int n; int L, R; int cntA[ASCII_SIZE]; int cntB[ASCII_SIZE]; int bufA[ASCII_SIZE]; int vis[ASCII_SIZE]; char A[SIZE], B[SIZE]; int minSize = -1; int ans[2]; int main() { scanf("%d", &n); while (n--) { minSize = -1; memset(cntA, 0, sizeof(int) * ASCII_SIZE); memset(cntB, 0, sizeof(int) * ASCII_SIZE); scanf("%s %s", A, B); int sizeA = strlen(A); int sizeB = strlen(B); for (int i = 0; i < sizeA; ++i) { cntA[A[i]]++; } for (int i = 0; i < sizeB; ++i) { cntB[B[i]]++; } for (int i = 0; i < ASCII_SIZE; ++i) { bufA[i] = cntA[i]; } int cnt = 0; int isFirst = 1; int isFound = 0; for (int i = 0; i < sizeB; ++i) { if (isFirst == 0) vis[B[i]]++; if (bufA[B[i]]) { if (isFirst) { L = i; isFirst = 0; vis[B[i]]++; } bufA[B[i]]--; cnt++; } if (cnt == sizeA) { R = i; minSize = R - L; isFound = 1; break; } } //printf("%d: %d %d\n", cnt, L + 1, R + 1); if (isFound == 0) { printf("baganono\n"); continue; } ans[0] = L; ans[1] = R; while (L < R) { L += 1; vis[B[L - 1]]--; while (R < sizeB - 1) { if (cntA[B[L - 1]] <= vis[B[L - 1]]) { break; } R += 1; vis[B[R]]++; } if (cntA[B[L - 1]] > vis[B[L - 1]]) break; else { if (R - L < minSize) { minSize = R - L; ans[0] = L; ans[1] = R; } } //printf("%d: %d\n", cntA[B[L - 1]], vis[B[L - 1]]); //printf("%d %d\n", L + 1, R + 1); } L = ans[0]; R = ans[1]; cnt = 0; printf("%d %d\n", L + 1, R + 1); for (int i = L; i <= R; ++i) { if (cntA[B[i]]) { cnt++; printf("%d", i + 1); if (cnt == sizeA) printf("\n"); else printf(" "); cntA[B[i]]--; } } } return 0; }
Editor is loading...
Leave a Comment