Pagini recente » Cod sursa (job #1617909) | Cod sursa (job #98223) | Cod sursa (job #87960) | Cod sursa (job #2489603) | Cod sursa (job #101693)
Cod sursa(job #101693)
#include <cstdio>
#include <cstdlib>
#define NR 3500000
#include <vector>
using namespace std;
char T[10000000], P[25];
int rez, N, M;
vector <int> V[NR];
inline int ok( int poz )
{
for (int i =0 ;i <M;i++)
if (T[i+poz] != P[i])
return 0;
return 1;
};
int main()
{
freopen("abc2.in", "r", stdin);
freopen("abc2.out", "w", stdout);
gets(T);
gets(P);
//scanf("%s\n", &T);
//scanf("%s\n", &P);
N = strlen(T);
M = strlen(P);
int p=0,t=0;
for (int i=0; i<M; i++)
{
p = ( 2*p + P[i]-'a'+1);
t = ( 2*t + T[i]-'a'+1);
}
V[t].push_back(0);
for (int i=0; i<N-M; i++)
{
//t = (d*(t - ((tonum(T[i])*h) % q)) + tonum(T[i+m])) % q;
t = 2*(t - (T[i]-'a'+1)*(1<<(M-1)) ) + T[i+M]-'a'+1;
if ( t<0) exit(1);
V[t].push_back(i+1);
}
//rez += V[p].size();
for (vector <int > :: iterator it = V[p].begin(); it!= V[p].end(); it++)
if ( *it >= 0 && ok(*it) )
{
rez++;
*it = -1;
};
for( gets(P); !feof(stdin); gets(P) )
{
p=0;
for (int i=0; i<M; i++)
p = ( 2*p + P[i]-'a'+1);
//rez+=V[p].size();
if ( p < 0 ) exit(1);
for (vector <int > :: iterator it = V[p].begin(); it!= V[p].end(); it++)
if ( *it >= 0 && ok(*it) )
{
rez++;
*it = -1;
};
//V[p].clear();
};
printf("%d", rez);
fclose(stdin);
fclose(stdout);
return 0;
};