欢迎光临
我们一直在努力

hihocoder 1766

#1766 : 字符串问题

时间限制:20000ms

单点时限:1000ms

内存限制:256MB

描述

一开始小 Hi 有一个空的字符串 T ,现在他想进行最少次数的操作使得 T 变成 S,操作有以下两种:

1.任选一个字符,将它加到 T 的最后面

2.选择 T 的一个子序列,将它加到 T 的最后面

定义一个串 A 是串 B 的子序列当且仅当串 A 可以由串 B 删掉某些位置后得到。

输入

第一行一个小写字母字符串 S

1 ≤ |S| ≤ 105

输出

输出最少需要几次操作

样例输入

aabaaaabaa

样例输出

5 #include <iostream>#include<bits/stdc++.h>using namespace std;const int MX=100000+1000;char s[MX],cps[MX];vector<int> g[30];int n;int main(){ while(cin>>s) { for(int i=0;i<30;i++) g[i].clear(); int p=0,st=-1,i=0; int cnt=0; n=strlen(s); while(i<n) { vps云服务器 char ch=s[p]; int up=upper_bound (g[ch-‘a’].begin(), g[ch-‘a’].end(), st)-g[ch-‘a’].begin(); // cout<<up<<endl; if(up==g[ch-‘a’].size()) { cnt++; if(st==-1) { g[ s[p++]-‘a’].push_back(i); } st=-1; for(int j=i;j<p;j++) g[ s[j]-‘a’].push_back(j); i=p; } else { st=g[ch-‘a’][up]; p++; } } if(i!=p) cnt++; cout<<cnt<<endl; } return 0;}

?

23602421

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。