1271: [蓝桥杯2015决赛]密文搜索【中 / map 字符串 排序】

在这里插入图片描述
http://oj.ecustacm.cn/problem.php?id=1271

这道题最早的思路是把字符串枚举所有的以 8个连续的字符串 并把它们标记为true。
根据输入找到就 加1。
后来才发现题目给的匹配条件是 两个字符串的只要各个字母的个数相同就是一次匹配。
在这里插入图片描述
这让我蒙蔽了,这俩字符串该如何匹配啊? 后来一想只要把每个字符串字典序排序比较就ok了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
map<string,int>mp;
int ans=0;
int main(void)
{
    
    
	string str;
	cin>>str;
	int i;
	
	int n;
	cin>>n;
	
	string s[1005];
	for(i=0;i<n;i++)
	{
    
    
		cin>>s[i];
	}
	
	for(i=0;i<=str.size()-8;i++)
	{
    
    
		string ss=str.substr(i,8);//每8个一组 
		sort(ss.begin(),ss.end());//排序存储,保存其出现的个数 
		mp[ss]++; 
	}
	for(i=0;i<n;i++)
	{
    
    
		sort(s[i].begin(),s[i].end());//先排序再匹配 
		ans+=mp[s[i]];
	}
	cout<<ans<<endl;
	return 0;
} 

压缩版:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int ans=0;
map<string,int> mp;
int main(void)
{
    
    
	string str; cin>>str;
	int n; cin>>n;
	int i;
	string s[1005];
	for(i=0;i<n;i++) cin>>s[i];
	for(i=0;i<=str.size()-8;i++)
	{
    
    
		string ss=str.substr(i,8);
		sort(ss.begin(),ss.end());
		mp[ss]++;//统计个数 
	}
	for(i=0;i<n;i++)
	{
    
    
		sort(s[i].begin(),s[i].end());
		ans+=mp[s[i]]; 	
	}	
	cout<<ans<<endl;
	return 0;
} 

总结: 本题的关键点在于要将每一段排序。很重要。

猜你喜欢

转载自blog.csdn.net/bettle_king/article/details/115377938