Untitled
unknown
c_cpp
a year ago
2.5 kB
7
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