Pagini recente » Cod sursa (job #1814652) | Cod sursa (job #1277801) | Cod sursa (job #1429730) | Cod sursa (job #2273028) | Cod sursa (job #1225893)
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<cstring>
#include<vector>
using namespace std;
const int BASE = 3;
const int MODULO = 666013;
const int max_l = 10000007;
const int lung_max_cuvant = 25;
vector <int> h[MODULO];
char cuvant[lung_max_cuvant];
char s[max_l];
int lung,p[lung_max_cuvant];
int sol;
void inserare(int x){
int zona=x%MODULO;
h[zona].push_back(x);
}
int cautare(int x){
int zona=x%MODULO;
for(int j=0;j<(int)h[zona].size();j++)
if(h[zona][j]==x) return j;
return -1;
}
void prelucrare_inserare(char *s, int n){
int i,x=0;
for(i=0;i<n;i++)
{
int cifra=s[i]-'a';
x=x*BASE+cifra;
}
int k=cautare(x);
if(k==-1) inserare(x);
}
void rezolvare(char *s, int n){
int i,x=0;
for(i=0;i<lung;i++)
{
int cifra=s[i]-'a';
x=x*BASE+cifra;
}
if(cautare(x)!=-1) sol++;
for(i=lung;i<n;i++)
{
int cifra=s[i]-'a';
x=x*BASE-((s[i-lung]-'a')*p[lung])+cifra;
if(cautare(x)!=-1) sol++;
}
}
int main(void){
assert(freopen("abc2.in","r",stdin));
assert(freopen("abc2.out","w",stdout));
assert(fgets(s,max_l,stdin));
p[0]=1;
for(int i=1;i<20;i++) p[i]=3*p[i-1];
assert(fgets(cuvant,lung_max_cuvant,stdin));
lung=strlen(cuvant)-1;
prelucrare_inserare(cuvant,lung);
while(fgets(cuvant,lung_max_cuvant,stdin)) prelucrare_inserare(cuvant,lung);
rezolvare(s,strlen(s)-1);
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}