1 条题解

  • 0
    @ 2024-11-19 18:04:05

    首先字符集大小是 2626 考虑状压,即把字符串映射为二进制。

    对于 TT 的每个下标可以用调和级数和状压映射出其二进制数,每个人的天赋直接遍历字符串映射为二进制。

    两个二进制数 (a,b),ab=b(a,b),a|b=b ,即 aa 属于 bb

    #include <bits/stdc++.h>
    
    using i64 = long long;
    using u32 = unsigned;
    using u64 = unsigned long long;
    
    void solve() {
    	int n;
    	std::cin >> n;
    
    	std::vector<std::pair<int, int>> a(n);
    	for (int i = 0; i < n; ++i) {
    		std::string s;
    		std::cin >> s >> a[i].second;
    
    		for (auto j : s) {
    			int t = j - 'a';
    			a[i].first |= 1 << t;
    		}
    	}
    
    	std::string t;
    	std::cin >> t;
    
    	const int N = t.size();
    	std::vector<int> f(N + 1);
    	for (int i = 1; i <= N; ++i) {
    		for (int j = i; j <= N; j += i) {
    			int tt = t[i - 1] - 'a';
    			f[j] |= 1 << tt;
    		}
    	}
    
    	for (auto [u, v] : a) {
    		std::cout << ((u | f[v]) == f[v] ? "YES" : "NO") << "\n";
    	}
    }
    
    int main() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
    
        int t;
        std::cin >> t;
    
        while (t--) {
            solve();
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    142
    时间
    2000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    15
    已通过
    5
    上传者