#include #include #include #include #include #include #include #include using namespace std; int Hash(char c){ if(c>='a' && c<='z') return c-'a'; else return c-'A'+26; } struct trieNode { trieNode *next[52]; int number; trieNode() { for(int i = 0; i < 52; i++) { next[i] = NULL; number=0; } } }; trieNode *Root; void insertString(string str) { trieNode *pt = Root; for (int i = 0; i < str.length(); i ++) { if (pt->next[Hash(str[i])] != NULL) { // (pt->next[Hash(str[i])])->number ++; } else { pt->next[Hash(str[i])] = new trieNode(); //(pt->next[Hash(str[i])])->number ++; } pt = pt->next[Hash(str[i])]; } pt->number++; } void deleteTree(trieNode *root) { for (int i = 0; i < 52; i ++) { if (root->next[i] != NULL) { deleteTree(root->next[i]); } } free(root); } int search(string str) { trieNode *pt = Root; int i = 0; for (i = 0; i < str.length(); i ++) { if (pt->next[Hash(str[i])] != NULL) { pt = pt->next[Hash(str[i])]; } else { break; } } if (i < str.length()) { return 0; } return pt->number; } int main() { Root = new trieNode(); string s; int n,T; char str[100]; scanf("%d",&n); while(n--) { scanf("%s",str); int len=strlen(str); sort(str,str+len); s=str; printf("%d\n",search(s)); insertString(s); } // deleteTree(Root); return 0; }