P8630 [蓝桥杯 2015 国 B] 密文搜索

· · 题解

题目传送门

题意

就是求从第一份资料中搜索可能隐藏密码的位置。并要输出所有排列在 s 中匹配次数的总和。

思路

因为密码是打乱的,所以要先对这个字符串排序。然后将排列后出现的号码依次相加,最后再在字符串中取连续 8 位,加上出现次数就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
map<string,int>mp;//map容器统计出现的号码
string s,x;
int n,ret;
int main(){
    cin>>s>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        sort(x.begin(),x.end());//对字符串x排序
        mp[x]++;
    }
    for(int i=0;i<s.size()-7;i++)
    {
        x=s.substr(i,8);
        sort(x.begin(),x.end());
        ret+=mp[x];
    }
    cout<<ret;
    return 0;
}