Cod sursa(job #1747871)

Utilizator mucalmicmarcel almic mucalmic Data 25 august 2016 18:21:30
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <queue>          // std::priority_queue
#include <vector>         // std::vector
#include <functional>     // std::greater

using namespace std;

//16:33


int main() {
    int n, m;
    const int mod = 997;
    int c = 67;
	string s1, s2;
    ifstream myfile;
    myfile.open ("strmatch.in");
    myfile>>s1>>s2;
    n = s1.size();
    m = s2.size();
    vector <int> p(n);
   	vector <int> rez;
    	
    myfile.close();	
    
    if (n && n < m) {
     	int h1, h2, k = 0;
     	h1 = h2 = 0;
     	p[0] = 1;
     	for (int i = 1; i < n; i++) 
     		p[i] = c * p[i-1];
     	
     	for (int i = 0; i < n; i++) {
     		h1 += s1[i]*p[n-1-i];
     		h2 += s2[i]*p[n-1-i];
     	}
     	
     	if (h1 == h2 && s2.compare(0, n, s1) == 0) {
     		rez.push_back(0);
     	}
     	
     	for (int i = n; i < m; i++) {
     		h2 -= p[n-1]*s2[i-n];
     		h2 = h2 * c + s2[i];
     		//cout<<i<<" "<<h1<<" "<<h2<<endl;
     		if (h1 == h2 && s2.compare(i-n+1, n, s1) == 0) {
     			rez.push_back(i-n+1);
     			//if (rez.size() == 1000)
     				//break;
     		}
     	}	   
    }
    
	ofstream f2;
	f2.open ("strmatch.out");
	n = rez.size();
	f2<<n<<endl;
	n = max(n, 1000);
	for (int i = 0; i < n; i++) {
		f2<<rez[i]<<" ";
	}
		f2<<endl;
	f2.close();
    
    return 0;
}