Pagini recente » Cod sursa (job #2979262) | Cod sursa (job #458831) | Cod sursa (job #163017) | Cod sursa (job #638437) | Cod sursa (job #800844)
Cod sursa(job #800844)
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int MAXL=2000000;
char needle[MAXL],haystack[MAXL];
int needleLength,haystackLength;
int state;
int prefix[MAXL];
vector <int> results;
int resultsNr;
void read(){
string aux;
in>>aux;
for(int i=0;i<aux.length();++i){
needle[i+1]=aux[i];
}
needleLength=aux.length();
in>>aux;
for(int i=0;i<aux.length();++i){
haystack[i+1]=aux[i];
}
haystackLength=aux.length();
}
void buildPrefix(){
int prefixState=0;
for(int i=2;i<=needleLength;++i){ // incepem de la 2 pentru ca avem nevoie de primul sufix propriu care e prefix
while(prefixState && needle[i]!=needle[prefixState+1]){
prefixState=prefix[prefixState];
}
if(needle[prefixState+1]==needle[i]) // daca se face potrivirea dupa sufixul/prefixul anterior se mareste sufixul/prefixul curent
prefixState++;
prefix[i]=prefixState;
}
}
void search(){
int currentState=0;
for(int i=1;i<=haystackLength;++i){
if(haystack[i]==needle[currentState+1] && currentState!=needleLength){
currentState++;
}
else{
currentState=prefix[currentState];
while(needle[currentState+1]!=haystack[i] && currentState){
currentState=prefix[currentState];
}
if(needle[currentState+1]==haystack[i]){
currentState++;
}
}
if(currentState==needleLength){
resultsNr++;
if(resultsNr<=1000){
results.push_back(i-needleLength);
}
}
}
}
void print(){
out<<resultsNr<<"\n";
for(int i=0;i<results.size();++i){
out<<results[i]<<" ";
}
}
int main(){
read();
buildPrefix();
search();
print();
return 0;
}