Pagini recente » Cod sursa (job #1560655) | Cod sursa (job #2328393) | Cod sursa (job #2564015) | Cod sursa (job #2196421) | Cod sursa (job #1222799)
#include <fstream>
#include <vector>
#include <queue>
#define DIM 10000010
#define DIM1 50011
using namespace std;
ifstream f("abc2.in");
ofstream g("abc2.out");
int k;
struct trie{
int sol;
bool ok;
trie *p[26],*ret;
vector<trie *> v;
trie(){
sol=0;
ret=0;
ok=false;
for(int i=0;i<26;i++) p[i]=0;
v.clear();
}
};
trie *root,*nod,*aux,*w[DIM1],*z;
char S[DIM],A[30],*P;
queue<trie *> Q;
trie *update(trie *r,char *s){
if(*s){
if(!r->p[*s-'a'])
r->p[*s-'a']=new trie;
return update(r->p[*s-'a'],s+1);
}
else{
if(r->ok)
return z;
r->ok=true;
return r;
}
}
void dfs(trie *nod){
for(register int i=0;i<nod->v.size();i++){
dfs(nod->v[i]);
nod->sol+=nod->v[i]->sol;
}
}
int main(void){
register int i,j;
f>>S;
root=new trie,z=new trie;
while(f>>A)
w[++k]=update(root,A);
Q.push(root);
while(!Q.empty()){
nod=Q.front();
Q.pop();
for(i=0;i<26;i++){
if(nod->p[i]){
aux=nod->ret;
while(aux && aux->p[i]==NULL) aux=aux->ret;
if(aux==0)
nod->p[i]->ret=root;
else
nod->p[i]->ret=aux->p[i];
nod->p[i]->ret->v.push_back(nod->p[i]);
Q.push(nod->p[i]);
}
}
}
nod=root;
for(P=S;*P;P++){
while(nod!=root && nod->p[*P-'a']==NULL) nod=nod->ret;
if(nod->p[*P-'a']!=NULL) nod=nod->p[*P-'a'];
nod->sol++;
}
dfs(root);
int nr=0;
for(i=1;i<=k;i++)
nr+=w[i]->sol;
g<<nr;
f.close();
g.close();
return 0;
}