木子CoCo~


私信TA

用户名:uq_78084890535

访问量:8476

签 名:

等  级
排  名 1169
经  验 3134
参赛次数 1
文章发表 24
年  龄 20
在职情况 学生
学  校 泰州学院
专  业 计算机科学与技术

  自我简介:

努力是奇迹的别名!

解题思路:
1.将s从下标i为0--->下标len-8,截取长度为substr(i,8)存放在类型为string的st集合中

2.输入n行字符串s密码,需要获取字符串s的所有排列。利用sort对s进行升序排列,判断是否在集合st中;然后用STL中的next_permutation()会获取[first,last)所标识之序列的下一个排列组合,如果没有下一个排列组合,便返回false否则返回true。

3.next_persumatation()算法思想:

(1)首先从最尾端开始往前寻找两个相邻元素,令第一个元素为*i,第二个元素为*ii,且满足*i<*ii。

(2)找到这样一组相邻元素后,再从尾端开始往前检验,找出第一个大于*i的元素,令为*j,将i,j元素对调(swap)。

(3)再将下标i之后的所有元素颠倒reverse排序

捕获.PNG

参考代码:

#include<iostream>
#include<set>
#include<algorithm>
#include<string>
using namespace std;
string s;
int n,ans;
int main(){
	set<string> st;
	cin>>s;
	int len=s.length();
	//从下标0--->len-8开始截取长度为8的字符串  
	//将长度为8的字符串存放在set中 
	for(int i=0;i<=len-8;i++){
		st.insert(s.substr(i,8));
	}
	 cin>>n;
	 while(n--){
	 	cin>>s;
	 	//首先将输入的密码进行升序排序 
	 	sort(s.begin(),s.end());
	 	if(st.count(s)) {
	 		//若集合st中存在s 
	 		ans++; 
	 	 }
	 	 while(next_permutation(s.begin(),s.end())){
	 	 	 if(st.count(s)) {
	 		  //若集合st中存在s 
	 		  ans++; 
	 	     }
	 	 }
	 	
	 }
	 cout<<ans<<endl;
	return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »