zoukankan      html  css  js  c++  java
  • [CF514C] Watto and Mechanism

    Description

    给出 (n) 个已知字符串,(m) 次询问,每次询问给出一个字符串,问上面 (n) 个字符串中是否有一个字符串满足恰好有一个字母不同于询问的字符串。字符串的字符集为 {a,b,c}

    Solution

    对于每个已知字符串,我们可以将它的 hash 值扔进一个集合里。

    对于每个询问串,我们枚举修改哪一个字符,以及修改成什么。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1e6 + 5;
    const int mod = 1e11 + 7;
    const int bas = 137;
    
    int n, m;
    string src[N], query[N];
    int pwr[N];
    
    int clamp(int x)
    {
        return (x % mod + mod) % mod;
    }
    
    int gethash(string s)
    {
        int ans = 0;
        for (int i = 0; i < s.length(); i++)
        {
            ans += s[i] * pwr[i];
            ans %= mod;
        }
        return ans;
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> src[i];
        for (int i = 1; i <= m; i++)
            cin >> query[i];
    
        pwr[0] = 1;
        for (int i = 1; i < N; i++)
            pwr[i] = pwr[i - 1] * bas % mod;
    
        set<int> s;
    
        for (int i = 1; i <= n; i++)
        {
            int hashval = gethash(src[i]);
            s.insert(hashval);
        }
    
        for (int i = 1; i <= m; i++)
        {
            int origin_hashval = gethash(query[i]);
            vector<int> modified_hashval;
    
            string &str = query[i];
    
            int len = str.length();
            for (int j = 0; j < len; j++)
            {
                char ch = str[j];
                if (ch == 'a')
                {
                    modified_hashval.push_back(clamp(origin_hashval + pwr[j]));
                    modified_hashval.push_back(clamp(origin_hashval + pwr[j] * 2));
                }
                if (ch == 'b')
                {
                    modified_hashval.push_back(clamp(origin_hashval + pwr[j]));
                    modified_hashval.push_back(clamp(origin_hashval - pwr[j]));
                }
                if (ch == 'c')
                {
                    modified_hashval.push_back(clamp(origin_hashval - pwr[j]));
                    modified_hashval.push_back(clamp(origin_hashval - pwr[j] * 2));
                }
            }
    
            int flag = 0;
    
            for (auto val : modified_hashval)
            {
                if (s.find(val) != s.end())
                {
                    flag = 1;
                    break;
                }
            }
    
            cout << (flag ? "YES" : "NO") << endl;
        }
    }
    
  • 相关阅读:
    【转】Intellij IDEA常用配置详解
    scala(一)
    scala(三)
    Scrapy学习篇(六)之Selector选择器
    Scrapy学习篇(五)之Spiders
    Scrapy学习篇(四)之数据存储
    Scrapy学习篇(三)之创建项目
    Scrapy学习篇(二)之常用命令行工具
    Scrapy学习篇(一)之框架
    git实现github仓库和本地仓库同步
  • 原文地址:https://www.cnblogs.com/mollnn/p/14096649.html
Copyright © 2011-2022 走看看