列表

详情


NC16763. 托米的咒语

描述

托米没有完成上一个任务,准备施展黑魔法推倒 1317

黑魔法咒语被描述为一个 长为 n 的,仅包含小写英文字母 'a'...'i' 的字符串,在托米所在的星球,魔法造成的每次有效伤害都是来自他的一个子序列,对于每一个 'a'... 'i' 的排列(共 9! 种),若作为咒语的子序列出现, 就会造成 1 的伤害

而咒语的总伤害为所有 'a'... 'i' 的排列造成的伤害值之和,托米能打出多少点的伤害,是否能击败 1317 呢?

输入描述

一行输入一个字符串 s

输出描述

一行输出一个数,表示伤害值

示例1

输入:

aabcdefghi

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 619ms, 内存消耗: 504K, 提交时间: 2018-07-28 19:47:27

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[]={"abcdefghi"};
int main()
{
	char a[3010];
	scanf("%s",a);
	int l=strlen(a);
	int sum=0;
	do{
		int i=0,j=0;
		while(i<9&&j<l)
		{
			if(a[j]==s[i])
			i++,j++;
			else
			j++;
		}
		if(i==9)
		sum++;
	}while(next_permutation(s,s+9));
	printf("%d\n",sum);
}

C++11(clang++ 3.9) 解法, 执行用时: 509ms, 内存消耗: 480K, 提交时间: 2020-03-11 10:26:57

#include<bits/stdc++.h>
#define N 3005
using namespace std;
int ans,n;
char s[N],b[10]="abcdefghi";
signed main()
{
	scanf("%s",s);
	n=strlen(s);
	do
	{
		int p=0,i=0;
		while(p<9&&i<n)
		if(s[i]==b[p]) p++,i++;
		else i++;
		ans+=(p==9);
	}while(next_permutation(b,b+9));
	cout<<ans;
 } 

上一题