其他分享
首页 > 其他分享> > 密文搜索 (排序预处理+map,string)

密文搜索 (排序预处理+map,string)

作者:互联网

资源限制
内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s
  福尔摩斯从X星收到一份资料,全部是小写字母组成。
  他的助手提供了另一份资料:许多长度为8的密码列表。
  福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

  请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。

  数据格式:

  输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
  紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
  紧接着是n行字符串,都是小写字母组成,长度都为8

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

  例如:
  用户输入:
  aaaabbbbaabbcccc
  2
  aaaabbbb
  abcabccc

  则程序应该输出:
  4

  这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。


  资源约定:
  峰值内存消耗 < 512M
  CPU消耗 < 3000ms


  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

  注意: main函数需要返回0
  注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
  注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

  提交时,注意选择所期望的编译器类型。
View Problem

思路:

#include <bits/stdc++.h>

using namespace std;


#define ri register int
#define M 10005

template <class G> void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}


map<string,int>mp;
int n;
string s;
int main(){
    
    cin>>s;
    cin>>n;
    for(ri i=1;i<=n;i++)
    {
        string tmp;
        cin>>tmp;
        sort(tmp.begin(),tmp.end());
        mp[tmp]++;
    }
    long long ans=0;
    for(ri i=0;i<s.length();i++)
    {
        string tmp=s.substr(i,8);
        sort(tmp.begin(),tmp.end());
        if(mp.count(tmp))
        {
            ans+=mp[tmp];
        }
    }
    printf("%lld",ans);
    return 0;
    
    
}
View Code

注意: 蓝桥杯不能使用 unordered map!!!!

标签:tmp,map,ch,string,int,密码,密文,ri
来源: https://www.cnblogs.com/Lamboofhome/p/16342155.html