题意:
给你 n 个单词库,m个询问,每个询问给你一个目标单词str,问在n个单词库中str为其子串有多少个。
思路:
对单词库中的每个单词的字串都建一次树,同一个串的字串可能有相同前缀的字串,
所以添加变量记录在同一个串是否已经计数过。
#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF 1e8 #define eps 1e-8 #define LL long long #define maxn 26 #define mol 1000000007 char s[22]; struct Trie { Trie *next[maxn]; int v; int id; }root; void creatTrie(char *str,int k) { int len = strlen(str); Trie *p = &root,*q; for(int i=0;i next[id]==NULL) { q=(Trie *)malloc(sizeof(Trie)); q->v=1; q->id=k; for(int j=0;j next [j]=NULL; p->next [id]=q; p=p->next [id]; } else { p=p->next[id]; } if(p->id!=k) { p->id=k; p->v++; } } //p->v=1; } int find (char *str) { int len = strlen(str); Trie *p=&root; for(int i=0;i next[id]; if(p==NULL) return 0; } return p->v ; } int deal(Trie *T) { int i; if(T==NULL) return 0; for(i=0;i next [i]!=NULL) deal(T->next[i]); free(T); return 0; } int main() { int i,n,m; for(i=0;i