• qdulq-2015 国赛B组C++【密文搜索】(状压)


    密文搜索

    福尔摩斯从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>, 不能通过工程设置而省略常用头文件。

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

    题解:

    本题密码长度为8,我们可以把密码串看做一个26进制数

    0对应a,1对应b。。。

    然后把26进制串都转化为10进制数,

    最大的情况,26的8次方是一个12位数字,用long long存储即可

    这样计算机就方便搜索了。

    1、对于输入的长串,每个长度为8的区间打一个表,以十进制存储。

    2、对于每一个输入的密码串,转化为10进制数字

    3、对长串打好的表扫描一遍,找一找有多少个值相等即可

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    typedef long long ll;
    
    const int MAXN = 1024*1024+5;
    
    char S[MAXN];//存储字符串 
    char s[10];//存储密码 
    ll SValue[MAXN];//存储字符串每8个字符对应的ll值 
    ll len;//存储字符串长度 
    
    ll Tran(char S[]){	/*长度8字符串转换为ll*/
    	char mid[10];
    	memcpy(mid,S,9);
    	sort(mid,mid+8);/*一定要排序*/
    	ll re = 0;
    	for(int i=0 ; i<8 ; i++){
    		re = re*26 + (mid[i]-'a');
    	}
    	return re;
    }
    
    ll Find(ll mid){/*查找有多少个符合的*/
    	ll t = 0;
    	for(int i=0 ; i<len ; i++){
    		if(SValue[i] == mid)t++;
    	}
    	return t;
    }
    
    int main(){
    	
    	scanf("%s",S);
    	len = strlen(S);
    	for(int i=0 ; i<len-7 ; i++){
    		SValue[i] = Tran(S+i);
    	}
    	int N;
    	ll sum = 0;
    	scanf("%d",&N);
    	while(N--){
    		scanf("%s",s);
    		ll mid = Tran(s);
    		sum += Find(mid);
    	}
    	cout<<sum<<endl;
    	
    	return 0;
    } 
  • 相关阅读:
    西门子S7-300 设置IP、子网掩码
    [WCF编程]9.性能与限流
    [WCF编程]8.服务实例的生命周期
    [WCF编程]7.实例上下文模式
    [WCF编程]6.绑定行为
    [WCF编程]5.绑定概述
    [WCF编程]4.契约概述
    [WCF编程]3.WCF基础
    [WCF编程]2.SOA概述
    [WCF实践]1.WCF使用net.tcp寄宿到IIS中
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514141.html
Copyright © 2020-2023  润新知