标签:ever letter several mil recommend UI int and clu
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 5761 Accepted Submission(s): 1911
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN=26; //只有小写字母 typedef struct Trie{ int v; int num; //进行标记 Trie *next[MAXN]; }Trie; Trie *root; char r[100]; void createTrie(char *str,int k) { int len=strlen(str); Trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-‘a‘; if(p->next[id]==NULL) { q=(Trie*)malloc(sizeof(Trie)); q->num=k; //将后缀的每一部分都标记 q->v=1; //每次建立新节点进行初始化操作 for(int j=0;j<MAXN;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { if(p->next[id]->num!=k){ p->next[id]->v++; //如果和标记不相等,代表不是同一字符串,才进行计数 p->next[id]->num=k; } p=p->next[id]; } } } int findTrie(char *str) { int len=strlen(str); Trie *p=root; for(int i=0;i<len;i++) { int id=str[i]-‘a‘; p=p->next[id]; if(p==NULL) return 0; } return p->v; } int deal(Trie *T) { int i; if(T==NULL) return 0; for(int i=0;i<MAXN;i++) { if(T->next[i]!=NULL) deal(T->next[i]); } free(T); return 0; } int main() { char str[21]; char s[100]; int t,n,flag,cnt,m; root=(Trie*)malloc(sizeof(Trie)); for(int i=0;i<MAXN;i++) root->next[i]=NULL; root->v=false; //初始化 scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",str); int len=strlen(str); for(int j=0;j<len;j++){ for(int k=j;k<len;k++) { r[k-j]=str[k]; } r[len-j]=‘\0‘; createTrie(r,i); } } scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%s",s); printf("%d\n",findTrie(s)); } //deal(root); return 0; }
还需要注意的是,在这个题,每个字符数组都只使用一次,所以不用开二维数组进行记录
标签:ever letter several mil recommend UI int and clu
原文地址:http://www.cnblogs.com/a249189046/p/7469533.html