今天主要是学习了全排列,深度优先搜索,二分的使用。
1.
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
Input
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
Output
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
Sample Input
abc
Sample Output
abc acb bac bca cab cba
思路:主要是使用全排列,用递归函数来完成。
代码:
#include<stdio.h>
#include<string.h>
int book[7],n;
char a[7],b[7];
void dsf(int s)
{
int i;
if(s==n)
{
a[s]='\0';
printf("%s\n",b);
}
for(i=0;i<n;i++)
if(book[i]==0)
{
b[s]=a[i];
book[i]=1;
dsf(s+1);//调用自己
book[i]=0;
}
}
int main()
{
scanf("%s",a);
n=strlen(a);
dsf(0);
getchar();
return 0;
}
2.
蒜头君手上有个长度为 n的数组 A。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 A 中,等于 x 的数字有多少个?
输入格式
第一行输入两个整数 n 和 m,分别表示数组的长度和查询的次数。
接下来一行有 n个整数 ai。
接下来 m 行,每行有 1 个整数 x,表示蒜头君询问的整数。
输出格式
对于每次查询,输出一个整数,表示数组 A 中有多少个 x。
数据范围
1 \le n, m \le 10^5, 0 \le x \le 10^61≤n,m≤105,0≤x≤106。
Sample Input
10 5 1 1 1 2 3 5 5 7 8 9 0 1 4 9 10
Sample Output
0 3 0 1 0<