Pagini recente » Cod sursa (job #1407866) | Cod sursa (job #2696371) | Cod sursa (job #586245) | Cod sursa (job #649727) | Cod sursa (job #3238118)
#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;
}