Cod sursa(job #2232430)

Utilizator b10nd3Oana Mancu b10nd3 Data 19 august 2018 02:39:56
Problema Aho-Corasick Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#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;
}