Cod sursa(job #3238118)

Utilizator elisa.ipateElisa Ipate elisa.ipate Data 20 iulie 2024 11:12:20
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;
 
#define int long long
#define base1 53
#define base2 57
const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;
#define nmax 2000001

struct info{
	int a, b;
	bool operator == (const info&x ) const {
		if( x.a == a && x.b == b )
			return true;
		return false;
	};
};

string a, b;

info putere[nmax];
info v[nmax], zero = {0, 0}, sp[nmax];

int to_number( char ch ) {
	if( 'a' <= ch && ch <= 'z' )
		return ch - 'a';
	return ch - 'A' + 27;
}

signed main() {
	int cnt = 0, i;
	info rez = zero;
	ifstream cin("strmatch.in");
	ofstream cout("strmatch.out");
	cin >> a >> b;
	
	putere[0].a = 1;
	putere[0].b = 1;
	for( i = 1; i < b.size(); i++ ) {
		putere[i].a = (putere[i - 1].a * base1) % mod1;
		putere[i].b = (putere[i - 1].b * base2) % mod2;
		sp[i].a = (sp[i - 1].a * base1 + to_number(b[i - 1]) ) % mod1;
		sp[i].b = (sp[i - 1].b * base2 + to_number(b[i - 1]) ) % mod2;
	}
	
	for( i = a.size(); i <= b.size(); i++ ) {
		v[i].a = (sp[i].a - (sp[i - a.size()].a * putere[a.size()].a) % mod1 + mod1) % mod1;
		v[i].b = (sp[i].b - (sp[i - a.size()].b * putere[a.size()].b) % mod2 + mod2) % mod2;
	}
	
	for( i = 0; i < a.size(); i++ ) {
		rez.a = (rez.a + putere[a.size() - 1 - i].a * to_number( a[i] ) ) % mod1;
		rez.b = (rez.b + putere[a.size() - 1 - i].b * to_number( a[i] ) ) % mod2;
	}
	
	for( i = a.size() - 1; i < b.size(); i++ ) {
		if( v[i] == rez )
			cnt++;
	}
	cout << cnt << "\n";
	
	for( i = a.size(); i <= b.size(); i++ ) {
		if( v[i] == rez )
			cout << i - a.size() + 1 << " ";
	}
	cout << "\n" << rez.a << " " << rez.b << "\n";
	return 0;
}