当前位置: 首页 > news >正文

密文搜索 | 第六届蓝桥杯国赛C++B组

福尔摩斯从 X 星收到一份资料,全部是小写字母组成。

他的助手提供了另一份资料:许多长度为 8 的密码列表。

福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。

要考虑密码的所有排列可能性。

输入格式

第一行:一个字符串 s,全部由小写字母组成。

紧接着一行是一个整数 n,表示以下有 n 行密码。

紧接着是 n 行字符串,都是小写字母组成,长度都为 8。

输出格式

一个整数,表示每行密码的所有排列在 s 中匹配次数的总和。

数据范围

字符串 s 的长度不超过 220,
1≤n≤1000

输入样例:
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
输出样例:
4
样例解释

第一个密码匹配了 3 次,第二个密码匹配了 1 次,一共 4 次。

题解:

        最早开始的思想是前缀和,用一个二维向量记录st中每一位之前的字母数量情况,再与那1000个密码进行比较,效率O(N2).

        后面TLE了,于是换了移动窗口的思想,但是还是TLE了。

        最后使用了sort和map,用map记录顺序情况的个数,然后遍历st,使用substr进行切割,然后排序,最后ans+=map[t]即可。时间O(N*Log2N)。

代码:

AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
#include<set>
using namespace std;
typedef long long int ll;
const int INF=1e16;

long long int ans=0;
map<string,int> mp;

void solve(){
    int n;
    string st;
    cin >> st;
    cin >> n;
    for(int i=0;i<n;i++){
        string s;
        cin >> s;
        sort(s.begin(),s.end());
        mp[s]++;
    }
    for(int i=0;i<=st.size()-8;i++){
        string a=st.substr(i,8);
        sort(a.begin(),a.end());
        ans+=mp[a];
    }
    cout << ans << "\n";
}

int main(){
    solve();
}

TLE代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<unordered_set>
#include<unordered_map>
#include<map>
#include<set>
using namespace std;
typedef long long int ll;
const int INF=1e16;

vector<vector<int>> pre((1<<20)+5,vector<int>(30,0));
vector<vector<int>> m(1001,vector<int>(30,0));
long long int ans=0;

void solve(){
    int n;
    string st;
    cin >> st;
    cin >> n;
    for(int i=0;i<n;i++){
        string s;
        cin >> s;
        for(int j=0;j<s.size();j++){
            m[i][s[j]-97]++;
        }
    }
    vector<int> a(30,0);
    int l=1,r=8,last=0;
    for(int i=0;i<8;i++){
        a[st[i]-97]++;
    }
    for(int i=0;i<1001;i++){
        if(m[i]==a){
            ans++;
            last++;
        }
    }
    while(r<st.size()){
        if(st[r]==st[l-1]){
            ans+=last;
        }
        else{
            a[st[r]-97]++;
            a[st[l-1]-97]--;
            last=0;
            for(int i=0;i<1001;i++){
                if(m[i]==a){
                    ans++;
                    last++;
                }
            }
        }
        r++;l++;
    }
    cout << ans << "\n";
}

int main(){
    solve();
}

http://www.dtcms.com/a/98130.html

相关文章:

  • GMP调度模型
  • GAMMA数据处理(十)
  • RabbitMQ高级特性--发送方确认
  • AIOHTTP
  • 2025年3月电子学会c++五级真题
  • GOF23种设计模式
  • 树莓派5智能家居中控:HomeAssistant全配置指南
  • 笔记:基于环境语义的通感融合技术,将传统通信由“被动接收”转为“主动感知”
  • synchronized锁与lock锁的区别
  • 实变函数:集合与子集合一例(20250329)
  • JavaFX基础- Button 的基本使用
  • Linux进程管理之子进程的创建(fork函数)、子进程与线程的区别、fork函数的简单使用例子、子进程的典型应用场景
  • 【19期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股实时交易数据及接口API说明文档
  • 参加李继刚线下活动启发:未来提示词还会存在吗?
  • 【初阶数据结构】线性表之双链表
  • 【数电】半导体存储电路
  • 基于Linux平台安装部署Redis全教程
  • 生物化学笔记:医学免疫学原理09 白细胞分化抗原+黏附分子
  • Supplements of My Research Proposal: My Perspectives on the RAG
  • 数据结构:探秘AVL树
  • 【华为OD技术面试真题 - 技术面】- Java面试题(15)
  • Android开发中的数据结构与算法:排序算法
  • TCP协议与wireshark抓包分析
  • 如何封装一个上传文件组件
  • 小河:团队金牌精准计划
  • QML中使用Image显示图片和使用QQuickItem显示图片
  • 告别桌面杂乱与充电焦虑,移速165W百变桌面充电站首发体验
  • Day43 | 129. 求根节点到叶节点数字之和、1382. 将二叉搜索树变平衡、100. 相同的树
  • 循相似之迹:解锁协同过滤的核心推荐逻辑
  • OpenBMC:BmcWeb 生效路由4 将路由添加到Trie中