poj 1816

字符串匹配!!!

我用的是trie树+dfs;

写的太长了!!!时间效率也不高!!!

 

一道纠结很久的题一直强迫自己写出来!!!

 

wa了几次,错在了判重上

*j*j
jjj
应该是 4

但是由于*的存在,find递归是我的结果ans队列中应该有两个是4;所以输出时判断一下是否与前一个一样;

 

 #include #include #include #include #include using namespace std; int N,M; char pat[10]; char word[25]; struct node { public: node* next[28]; vector v; node() { memset(next,NULL,sizeof(next)); v.clear(); } }; struct com { bool operator()(int t1, int t2 ) { return t1>t2; } }; node* root=NULL; priority_queue,com> ans; void build_tree(char* p,int num) { node* temp0=root; int n=strlen(p); int i=0; for(i=0;i='a') { int x=p[i]-'a'; if(temp0->next[x]==NULL) { node* temp1=new(node); temp0->next[x]=temp1; } temp0=temp0->next[x]; } else if(p[i]=='*') { if(p[i+1]=='*') continue; if(temp0->next[26]==NULL) { node* temp1=new(node); temp0->next[26]=temp1; } temp0=temp0->next[26]; //printf("Hello/n"); } else if(p[i]=='?') { if(temp0->next[27]==NULL) { node* temp1=new(node); temp0->next[27]=temp1; } temp0=temp0->next[27]; } } if(p[i]<='z'&&p[i]>='a') { int x=p[i]-'a'; if(temp0->next[x]==NULL) { node* temp1=new(node); temp0->next[x]=temp1; } temp0=temp0->next[x]; temp0->v.push_back(num); } else if(p[i]=='*') { if(temp0->next[26]==NULL) { node* temp1=new(node); temp0->next[26]=temp1; } temp0=temp0->next[26]; temp0->v.push_back(num); // printf("Word/n"); } else if(p[i]=='?') { if(temp0->next[27]==NULL) { node* temp1=new(node); temp0->next[27]=temp1; } temp0=temp0->next[27]; temp0->v.push_back(num); } } void find(char * s,node* temp) { if(*s=='/0') { int i=0; while(i<(temp->v.size())) { ans.push(temp->v[i]); i++; } if(temp->next[26]!=NULL) { find(s,temp->next[26]); } return; } if(temp->next[*s-'a']!=NULL) { find(s+1,temp->next[*s-'a']); } if(temp->next[26]!=NULL) { int i=0; find(s+i,temp->next[26]); do { i++; find(s+i,temp->next[26]); }while(*(s+i)!='/0'); } if(temp->next[27]!=NULL) { find(s+1,temp->next[27]); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d%d",&N,&M); //while(scanf("%d%d",&N,&M)==2) //{ root=new(node); for(int i=0;i

你可能感兴趣的:(acm---字符串)