Cod sursa(job #974328)

Utilizator Cezar_16Cezar Ghimbas Cezar_16 Data 16 iulie 2013 20:38:48
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<string>
#include<vector>

using namespace std;

#define MAXN 2000001
#define PB 33

ifstream in("strmatch10.in");
ofstream out("strmatch.out");

vector<int> positions;

int hash_val;
int nr;

unsigned hash_function(const string& s)
{
    long long ret = 0;
    for (unsigned int i = 0; i < s.size(); i++)
    	ret = ret * PB + s[i];
    return ret;
}

inline bool same_letters(string s) {
	for(unsigned int i = 0; i < s.size(); i++) {
		if(s[i] != s[0])
			return false;
	}
	return true;
}


void rabin_karp(string s, string sub) {
	unsigned int m = sub.size(), n = s.size();
	long h_sub = hash_function(sub.c_str()),h_s;
	h_s = hash_function(s.substr(0,m).c_str());
	long long power = 1;
	
	bool ok = same_letters(sub);
	
	for (unsigned int i = 0; i < sub.size(); i++)
    	power = (power * PB);
	for(unsigned int i = 0; i < n - m + 1; i++) {
		if(ok && s[i] == s[i+m]) {
			positions.push_back(i);continue;
		}
		if(h_s == h_sub) {
			if(s.substr(i,m) == sub) 
				positions.push_back(i);
		}
		h_s = h_s * PB + s[i + m];
		h_s -= power * s[i];
	}
}

int main() {
	
	string sub,s;
	in>>sub>>s;
	if(s.size() < sub.size()) {
		out<<0<<"\n";
		return 0;
	}
	rabin_karp(s,sub);
	int len = positions.size();
	out<<len<<"\n";
	for(int i = 0; i < len; i++) {
		if(i == 1000)
			break;
		out<<positions[i]<<" ";
	}
	return 0;
}