Pagini recente » Cod sursa (job #2975435) | Cod sursa (job #2880266) | Cod sursa (job #88167) | Cod sursa (job #2321303) | Cod sursa (job #1222794)
#include <fstream>
#include <vector>
#include <queue>
#include <set>
#define DIM 10000010
#define DIM1 50011
using namespace std;
ifstream f("abc2.in");
ofstream g("abc2.out");
int k;
struct trie{
int sol;
trie *p[26],*ret;
vector<trie *> v;
trie(){
sol=0;
ret=0;
for(int i=0;i<26;i++) p[i]=0;
v.clear();
}
};
trie *root,*nod,*aux;
char S[DIM],A[30],*P;
set<trie *> w;
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
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;
set<trie *>::iterator it;
f>>S;
root=new trie;
while(f>>A)
w.insert(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(it=w.begin();it!=w.end();it++)
nr+=(*it)->sol;
g<<nr;
f.close();
g.close();
return 0;
}