Pagini recente » Borderou de evaluare (job #3361363) | Cod sursa (job #3363203) | Cod sursa (job #3363145) | Cod sursa (job #3363205) | Cod sursa (job #3363161)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXB = 2e6 , BZH = 67 , MODH = 1e9 + 7 , MAXI = 1e3;
int hb[MAXB + 1] , idx[MAXI + 1];
int conv ( char ch ) {
if ( 'A' <= ch && ch <= 'Z' )
return ch - 'A' + 1;
else if ( 'a' <= ch && ch <= 'z' )
return ch - 'a' + 27;
else
return ch - '0' + 53;
}
int mypow ( int b , int e ) {
int rez;
rez = 1;
while ( e > 0 ) {
if ( e % 2 == 1 )
rez = ( long long ) rez * b % MODH;
b = ( long long ) b * b % MODH;
e = e / 2;
}
return rez;
}
int get ( int dr , int st ) {
return ( hb[dr] - hb[st - 1] + MODH ) % MODH * ( long long ) mypow ( mypow ( BZH , st ) , MODH - 2 ) % MODH;
}
signed main () {
ifstream fin ( "strmatch.in" );
ofstream fout ( "strmatch.out" );
char la , lb;
int ha , pb , lenb , lena , i , leni;
fin.get ( la );
ha = lena = 0;
pb = 1;
while ( la != '\n' ) {
ha = ( ha + conv ( la ) * pb % MODH ) % MODH;
pb = ( pb * BZH ) % MODH;
lena++;
fin.get ( la );
}
cout << ha << '\n';
fin.get ( lb );
lenb = pb = 1;
while ( lb != '\n' ) {
hb[lenb] = ( hb[lenb - 1] + conv ( lb ) * pb % MODH ) % MODH;
lenb++;
pb = ( pb * BZH ) % MODH;
fin.get ( lb );
}
lenb--;
leni = 0;
for ( i = lena ; i <= lenb ; i++ ) {
cout << get ( i , i - lena + 1 ) << '\n';
if ( get ( i , i - lena + 1 ) == ha )
if ( leni < MAXI )
idx[++leni] = i - lena;
}
fout << leni << '\n';
for ( i = 1 ; i <= leni ; i++ )
fout << idx[i] << ' ';
fout.put ( '\n' );
return 0;
}