3045. 统计前后缀下标对 II

2 阅读1分钟

链接:leetcode.cn/problems/co…

思路:字典树

把正数i个字母和倒数i个字母揉成一个pair合并起来:int p=(int)(s[i]-'a')<<5|(s[n-1-i]-'a');

代码

struct Node{
    unordered_map<int,Node*>son;
    int cnt=0;
};

class Solution {
public:
    long long countPrefixSuffixPairs(vector<string>& words) {
        long long ans=0;
        Node *root=new Node();

        for(string &s:words){
            int n=s.size();
            auto cur=root;
            for(int i=0;i<n;i++){
                int p=(int)(s[i]-'a')<<5|(s[n-1-i]-'a');
                if(cur->son[p]==nullptr){
                    cur->son[p]=new Node();
                }
                cur=cur->son[p];
                ans+=cur->cnt;
            }
            cur->cnt++;
        }
        return ans;
    }
};