2016中国大学生程序设计竞赛 - 网络选拔赛 1011 Lweb and String hdu5842

    xiaoxiao2025-06-20  8

    Problem 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:AB  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,(1T20) . 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   直接统计不同字母数量即可。。 我还特意写了个LIS #include<map> #include<cmath> #include<queue> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int a[1000001]; int line[1000001]; int l[1000001]; int find(int ll,int rr,int x) { int mid; do { mid=(ll+rr)/2; if(x>line[mid]&&x<line[mid+1]) return mid; else if(x>=line[mid]) ll=mid+1; else rr=mid-1; } while(ll<=rr); return 0; } int v[40]; int main() { int T; scanf("%d",&T); int n,k=0; while(T>0) { T--; k++; string x; cin>>x; int n=x.size(); int i; memset(v,0,sizeof(v)); int d=0; for(i=0;i<n;i++) { int xx=x[i]-'a'; if(!v[xx]) { d++; v[xx]=d; a[i+1]=d; } else a[i+1]=v[xx]; } int len=1; line[len]=a[1]; int j; for(i=2;i<=n;i++) { if(a[i]>line[len]) j=++len; else j=find(1,len,a[i])+1; line[j]=a[i]; // printf("%d %d %d\n",line[1],line[2],line[3]); } printf("Case #%d: ",k); printf("%d\n",len); } }

    转载请注明原文地址: https://ju.6miu.com/read-1300154.html
    最新回复(0)