HDU 5842 Lweb and String (水题)

本文介绍了一道关于字符串转换的问题,通过将字符串中的字符映射为自然数,目标是找到一种映射方式,使得转换后的序列拥有最长的严格增子序列。文章提供了完整的解题思路与代码实现。

Lweb and String

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5842

Description


Lweb has a string S.
Oneday, he decided to transform this string to a new sequence.
You need help him determine this transformation to get a sequence which has the longest LIS(Strictly Increasing).
You need transform every letter in this string to a new number.
A is the set of letters of S, B is the set of natural numbers.
Every injection f:A→B can be treat as an legal transformation.
For example, a String “aabc”, A={a,b,c}, and you can transform it to “1 1 2 3”, and the LIS of the new sequence is 3.
Now help Lweb, find the longest LIS which you can obtain from S.
LIS: Longest Increasing Subsequence. (https://en.wikipedia.org/wiki/Longest_increasing_subsequence)

Input


The first line of the input contains the only integer T,(1≤T≤20).
Then T lines follow, the i-th line contains a string S only containing the lowercase letters, the length of S will not exceed 105.

Output


For each test case, output a single line "Case #x: y", where x is the case number, starting from 1. And y is the answer.

Sample Input


2
aabcc
acdeaa

Sample Output


Case #1: 3
Case #2: 4

Source


2016中国大学生程序设计竞赛 - 网络选拔赛


题意:


给出一个字符串,确定一组字符到自然数的一一映射.
使得结果数串的严格LIS最大.


题解:


由于字符串中仅含小写字母,那么结果最大就是26.
所以字符串中有多少个不同的字符,结果就是多少.


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <list>
#define LL long long
#define double long long
#define eps 1e-8
#define maxn 101000
#define mod 1000000007
#define inf 0x3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;

char str[maxn];

int main(int argc, char const *argv[])
{
    //IN;

    int t, ca=1; cin >> t;
    while(t--)
    {
        scanf("%s", str);

        int ans = 0;
        int sz = strlen(str);
        int state = 0;
        for(int i=0; i<sz; i++) {
            state |= 1<<(str[i]-'a');
        }

        for(int i=0; i<26; i++) {
            if(state & (1<<i)) ans++;
        }

        printf("Case #%d: %d\n", ca++, ans);
    }

    return 0;
}

转载于:https://www.cnblogs.com/Sunshine-tcf/p/5770779.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值