Cod sursa(job #3369150)

Utilizator DavidLDavid Lauran DavidL Data 17 octombrie 2026 14:18:49
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

vector<int> longestCommonPrefixSubfix;
vector<int> occurrences;

void getLongestCommonPrefixSubfix(const string& input) {
    int stringLength = input.size();
    longestCommonPrefixSubfix = vector<int>(stringLength);
    
    for (int i = 1; i < stringLength; i++) {
        int prefixSubfix = longestCommonPrefixSubfix[i - 1];
        while (prefixSubfix > 0 && input[i] != input[prefixSubfix]) {
            prefixSubfix = longestCommonPrefixSubfix[prefixSubfix];
        }
        longestCommonPrefixSubfix[i] = prefixSubfix + (input[i] == input[prefixSubfix]);
    }
}

void printSizeAndElements() {
    int occurencesSize = occurrences.size(); 
    fout <<  occurencesSize << "\n";
    for (int i = 0; i < occurencesSize && i < 1000; i++) {
        fout << occurrences[i] << " ";
    }
}

void findOccurrences(const string& smallString, const string& largeString) {
    getLongestCommonPrefixSubfix(smallString);

    int smallStringSize = smallString.size();
    int largeStringSize = largeString.size();

    int nextIndexToMatch = 0;
    for (int i = 0; i < largeStringSize && i + (smallStringSize - nextIndexToMatch - 1) < largeStringSize; i++) {
        // fout << "Arrived on index " << i << ". Next index to match=" << nextIndexToMatch << "\n";
        if (largeString[i] == smallString[nextIndexToMatch]) {
            if (nextIndexToMatch == smallStringSize - 1) {
                occurrences.push_back(i - smallStringSize + 1);
                
                nextIndexToMatch = longestCommonPrefixSubfix[smallStringSize - 1];
            } else {
                nextIndexToMatch++;
            }
        } else if (nextIndexToMatch > 0) {
            while (nextIndexToMatch > 0 && largeString[i] != smallString[nextIndexToMatch]) {
                nextIndexToMatch = longestCommonPrefixSubfix[nextIndexToMatch - 1];
            }
            if (largeString[i] == smallString[nextIndexToMatch]) {
                nextIndexToMatch++;
            }
        }
    }
}

int main() {
    string A;
    string B;
    getline(fin, A);
    getline(fin, B);

    findOccurrences(A, B);
    printSizeAndElements();

    return 0;
}