原题链接:http://www.51nod.com/onlineJudge/questionCode.html#problemId=1095¬iceId=20791
老实说这题,我是很不想用字典树,因为不熟~~~但后来没搞出来,就用了字典树。。。。。。。。。。当然得参考一下大神的代码。
解法:用map统计相同单词。。。
然后把字符串按字典序排序,然后把字符串插入到字典树里面去
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<map> #include<vector> #define maxn 10000 using namespace std; typedef struct node { int count; struct node *next[100];//因为有大写字母,所以数组要开的大点,防止越界 }*tree; void insert(tree h,string s) { int len=s.length(); tree p=h; for(int i=0;i<len;i++) { int index=s[i]-‘A‘; if(p->next[index]!=NULL) { p=p->next[index]; p->count++; } else { tree tem=(tree)calloc(1,sizeof(node)); tem->count=1; p->next[index]=tem; p=tem; } } } int find(tree h,string s) { tree p=h; int len=s.length(); for(int i=0;i<len;i++) { int index=s[i]-‘A‘; if(p->next[index]==NULL) return -1; p=p->next[index]; } int ans=p->count; for(int i=0;i<100;i++) { if(p->next[i]!=NULL) ans-=p->next[i]->count;//其他分支要减掉 } return ans; } int main() { int n,q; string s; tree h=(tree)calloc(1,sizeof(node)); scanf("%d %d",&n); map<string,int>S; for(int i=0;i<n;i++) { cin>>s; S[s]++; sort(s.begin(),s.end()); insert(h,s); } scanf("%d",&q); for(int i=0;i<q;i++) { int ans=0; string tmp; cin>>tmp; ans-=S[tmp]; sort(tmp.begin(),tmp.end()); int x=find(h,tmp); if(x==-1) printf("0\n"); else printf("%d\n",ans+x); } return 0; }
时间: 2024-10-27 13:37:07