串套串
思路
将所有的字符串插到字典树中,将串的结束点权值加一。
再次遍历所有字符串,统计其在字典树路径上的权值和。
Code
class Solution { #define maxn 2200010 private: int trie[maxn][26], pn = 0; int ed[maxn]; public: /** * 返回新集合的种类数 * @param n int整型 集合大小 * @param m int整型 限制数量 * @param limit Point类vector 不能同时出现的(u,v)集合 * @return int整型 */ void insert(string s) { int p = 0; for (int ch, i = 0; s[i]; ++i) { ch = s[i] - 'a'; if (!trie[p][ch]) trie[p][ch] = ++pn; p = trie[p][ch]; } ++ed[p]; } int query(string s) { int p = 0, ans = 0; for (int ch, i = 0; s[i]; ++i) { ch = s[i] - 'a'; p = trie[p][ch]; ans += ed[p]; } ans -= ed[p]; return ans; } vector<int> solve(int n, vector<string>& str_list) { // write code here memset(trie, 0, sizeof trie); memset(ed, 0, sizeof ed); pn = 0; for (int i = 0; i < n; ++i) { insert(str_list[i]); } vector<int> ans; for (int i = 0; i < n; ++i) { ans.push_back(query(str_list[i])); } return ans; } };