20 ad ae af ag ah ai aj ak al ads add ade adf adg adh adi adj adk adl aes 5 b a d ad s
0 20 11 11 2
題解:字典樹,把每一個字符串的字串都用字典樹保存下來,並且記錄下每一個子串的個數,但是要注意每個字符串可能有相同的字串,此時只加一次。例如ababc,ab只加一次
#include#include #include using namespace std; struct Node { int id; int num; Node* next[26]; Node() { id = -1; num = 0; for(int i = 0;i < 26;i++) { next[i] = NULL; } } }; Node* root; void insert(char* s,int k) { int len = strlen(s); Node* p = root; for(int i = 0;i < len;i++) { if(p->next[s[i] - 'a'] == NULL) { Node* q = new Node(); q->id = k; q->num = 1; p->next[s[i] - 'a'] = q; } p = p->next[s[i] - 'a']; if(p->id != k) { p->id = k; //該字符串中該子字符已經出現了 p->num++; //該字串個數加一 } } } int find(char* s) { int len = strlen(s); Node* p = root; for(int i = 0;i < len;i++) { if(p->next[s[i] - 'a'] == NULL) { return 0; } p = p->next[s[i] - 'a']; } return p->num; } void del(Node*& p) { for(int i = 0;i < 26;i++) { if(p->next[i] != NULL) { del(p->next[i]); } } delete p; } int main() { int n; while(scanf(%d,&n) != EOF) { root = new Node(); char s[100]; for(int i = 0;i < n;i++) { scanf(%s,s); for(int j = 0;s[j] != '';j++) { insert(s + j,i); } } int q; scanf(%d,&q); for(int i = 0;i < q;i++) { scanf(%s,s); printf(%d ,find(s)); } del(root); } return 0; }