Pagini recente » Cod sursa (job #2970765) | Cod sursa (job #26553) | Cod sursa (job #136101) | Cod sursa (job #3134926) | Cod sursa (job #2232430)
#include<iostream>
#include<fstream>
#include<string>
#include<queue>
#include<stack>
using namespace std;
struct trie{
int noApp;
trie *suffix, *nextLetter[28];
trie(){
noApp=0;
for(int i=0;i<26;i++) nextLetter[i]=NULL;
suffix=NULL;
}
} *root, *answ[105];
queue <trie*> road;
stack <trie*> reverseRoad;
void insert(string w, int x){
trie *current=root;
for(int i=0;i<w.size();i++){
if(current->nextLetter[w[i]-'a']==NULL)
current->nextLetter[w[i]-'a']=new trie();
current=current->nextLetter[w[i]-'a'];
}
answ[x]=current;
}
void setSuffix(){
trie *current, *currentSuffix;
int i;
root->suffix=root;
road.push(root);
while(!road.empty()){
current=road.front();
road.pop();
reverseRoad.push(current);
for(i=0;i<26;i++){
if(current->nextLetter[i]!=NULL){
currentSuffix=current->suffix;
while(currentSuffix!=root && currentSuffix->nextLetter[i]==NULL)
currentSuffix=currentSuffix->suffix;
if(currentSuffix->nextLetter[i]!=NULL && currentSuffix->nextLetter[i]!=current->nextLetter[i])
current->nextLetter[i]->suffix=currentSuffix->nextLetter[i];
else
current->nextLetter[i]->suffix=root;
road.push(current->nextLetter[i]);
}
}
}
}
void noApp(string s){
int l;
trie *current=root;
for(int i=0;i<s.size();i++){
l=s[i]-'a';
while(current->nextLetter[l]==NULL && current!=root)
current=current->suffix;
if(current->nextLetter[l]!=NULL) current=current->nextLetter[l];
current->noApp++;
}
while(!reverseRoad.empty()){
current=reverseRoad.top();
reverseRoad.pop();
current->suffix->noApp+=current->noApp;
}
}
int main(){
ifstream in("ahocorasick.in");
FILE *out=fopen("ahocorasick.out","w");
string s,w;
int n, i;
root=new trie();
in>>s>>n;
for(i=1;i<=n;i++){
in>>w;
insert(w,i);
}
setSuffix();
noApp(s);
for(i=1;i<=n;i++) fprintf(out,"%i\n",answ[i]->noApp);
in.close(); fclose(out);
return 0;
}