Cod sursa(job #3369147)

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

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

vector<int> getLongestCommonPrefixSubfix(string input) {
    int stringLength = input.size();
    vector<int> longestCommonPrefixSubfix(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]);
    }
    
    return longestCommonPrefixSubfix;
}

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

vector<int> findOccurrences(string smallString, string largeString) {
    vector<int> longestCommonPrefixSubfix = getLongestCommonPrefixSubfix(smallString);

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

int main() {
    string A;
    string B;
    fin >> A >> B;

    vector<int> occurrences = findOccurrences(A, B);
    printSizeAndElements(occurrences);

    return 0;
}