Untitled

 avatar
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