链接子字符串异或查询
思路:题目说 valfirst=secondval \oplus first=second

可得val=secondfirstval = second \oplus first

题目变成从010-1串中找到最先出现的valval的二进制表示,注意是10510^5次询问。原来认为是ACAC自动机类的东西,但仔细一想,数字最多3030位,那么字符串ss存在的数字数量仅为10510^5级别,那么我们可以预处理出所有数字的所在位置。

CodeCode

class Solution {
public:
    vector<vector<int>> substringXorQueries(string s, vector<vector<int>>& queries) {
        #define ll int 
        map<ll,pair<int,int > >S;
        int sz = s.size() - 1;
        for(int len=1;len<=30;++len){
            for(int i=0;;++i){
                if(s[i] == '0' and len != 1)continue;
                if(i+len-1>sz)break;
                ll now = 0;
                for(int j=i;j<=i+len-1;++j){
                    now <<= 1;
                    if(s[j] == '1')now += 1ll;
                }
                if(S.count(now))continue;
                S[now] = {i,i+len-1};
            }
        }
        vector<vector<int> > ans;
        int tot = -1;
        for(auto i:queries){
            ll res = (ll)i[0] ^ i[1];
            if(S.count(res)){
                ans.push_back({S[res].first,S[res].second});
            }else {
                ans.push_back({-1,-1});
            }
        }
        return ans ;
    }
};