Pagini recente » Cod sursa (job #297825) | Cod sursa (job #956467) | Cod sursa (job #2491492) | Cod sursa (job #1884018) | Cod sursa (job #1653927)
#include <iostream>
#include <vector>
#include <algorithm>
#include <limits>
#include <numeric>
#include <cstring>
#include <string>
#include <queue>
#include <set>
#include <cmath>
#include <fstream>
#include <cstdlib>
#include <map>
#define pb push_back
#define mp make_pair
#define INF numeric_limits<int>::max()
#define bit(x) (-x)&x
#define int64 long long
using namespace std;
ifstream in("abc2.in");
ofstream out("abc2.out");
string s,x;
#define mod1 66013
#define mod2 57697
#define P 3
vector< vector<int> > h(mod1);
bool v[22];
void ins(int c1,int c2)
{
for(int i=0;i<(int)h[c1].size();i++)
if(h[c1][i]==c2)
return;
h[c1].pb(c2);
}
int ok(int c1,int c2)
{
for(int i=0;i<(int)h[c1].size();i++)
if(h[c1][i]==c2)
return 1;
return 0;
}
int countWords(int m)
{
int p1=1,p2=1,c1=0,c2=0,cnt=0;
for(int i=m-1;i>=0;i--)
{
c1=(c1+s[i]*p1)%mod1;
c2=(c2+s[i]*p2)%mod2;
if(i!=0)
{
p1=(p1*P)%mod1;
p2=(p2*P)%mod2;
}
}
cnt+=ok(c1,c2);
for(int i=m;i<(int)s.size();i++)
{
c1=((c1-(s[i-m]*p1)%mod1+mod1)*P+s[i])%mod1;
c2=((c2-(s[i-m]*p2)%mod2+mod2)*P+s[i])%mod2;
cnt+=ok(c1,c2);
}
return cnt;
}
int main()
{
in>>s;
while(in>>x)
{
if(v[x.size()]==false)
v[x.size()]=true;
int p1=1,p2=1,c1=0,c2=0;
for(int i=x.size()-1;i>=0;i--)
{
c1=(c1+p1*x[i])%mod1;
c2=(c2+p2*x[i])%mod2;
p1=(P*p1)%mod1;
p2=(P*p2)%mod2;
}
ins(c1,c2);
}
int sol=0;
for(int i=1;i<=20;i++)
if(v[i]==true)
sol+=countWords(i);
out<<sol<<'\n';
return 0;
}