Pagini recente » Cod sursa (job #64465) | Cod sursa (job #3140126) | Cod sursa (job #981820) | Cod sursa (job #2208752) | Cod sursa (job #2588903)
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");
const int M = 666019, N = 50001;
unsigned int l = 25;
unsigned int val[N], urm[N], lst[M];
int nr;
string text;
string word;
unsigned int cod3(string s)
{
unsigned int c = 0;
for (unsigned int i = 0; i < s.length(); i++)
{
c = c * 3 + (s[i] - 'a');
}
return c;
}
bool apartine(unsigned int x)
{
int c = x % M;
for(int p = lst[c]; p != 0; p = urm[p]){
if(val[p] == x){
return true;
}
}
return false;
}
void adauga(int x)
{
int c = x % M;
if(apartine(x)){
return;
}
val[++nr] = x;
urm[nr] = lst[c];
lst[c] = nr;
}
int main()
{
in >> text;
int L = text.length();
while(in >> word){
adauga(cod3(word));
}
l = word.length();
unsigned int r = 0, c = cod3(text.substr(0, l));
if (apartine(c))
{
r++;
}
//p3 = 3 la l - 1
int p3 = 1, cop = l;
while(cop > 1){
p3 *= 3;
cop--;
}
for (unsigned int i = l; i < text.length(); i++)
{
c = c % p3 * 3 + (text[i] - 'a');
if (apartine(c))
{
r++;
}
}
out << r;
return 0;
}