【CodeForces - 387C】George and Number(思維)

題意:

喬治喜歡對他的數列 b 進行操作。 我們將喬治的數列表示成 b1, b2, ..., b|b| (其中 |b| 表示數列 b 的長度)。一次操作分爲以下幾個步驟:

  • 選擇兩個不同的數 i 和 j (1 ≤ i, j ≤ |b|; i ≠ j),滿足 bi ≥ bj.
  • 定義數 v = concat(bi, bj),其中 concat(x, y) 是將數 y 連接在數 x後面形成的新數。舉個例子,concat(500, 10) = 50010, concat(2, 2) = 22。
  • 將數 v 加到數列的末尾。數列長度增加1。
  • 將數列中第 i 項和第 j 項刪除。數列長度縮短 2 ,並且數列會被重新編號爲 1 到當前數列長度。

喬治進行了太多的操作使得數列 b 使得數列最終只存在一個數 p。現在喬治想知道,數列 b 最初最多能有幾個數?幫他求出答案。注意數列最初只能包含正整數。

Input

第一行包含一個整數 p (1 ≤ p < 10100000)。 保證數字 p 最高位不爲0。

Output

輸出一個整數 — 數列 b 最初的最長長度。

Example

Input

9555

Output

4

Input

10000000005

思路:

如果字符串中出現0的話肯定是和他前面第1個非0的數字組合的,單個的正整數自己爲一段,然後就可以將字符串分割爲幾段,從頭向後枚舉,如果之前已經組成的數字比當前的數字大,就直接合並,讓總共能成的段數加1,如果比當前的小則說明從開頭到當前的所有數字應該是在一個段中,否則的話當前這個數就要排在之前的數的前面,此時讓分段的數量爲1。

ac代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<unordered_map>
#define mod (1000000007)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+10;
struct node{
	int val,num;
}a[maxn];
char s[maxn]; 
int cnt=0,mx=0,mxa=0;
int main(){
	scanf("%s",s);
	for(int i=0;s[i];i++){
		if(s[i]>'0')
		a[cnt].num=0,a[cnt++].val=s[i]-'0';
		else a[cnt-1].num++;
	}
	int ans=1;
	mxa=a[0].val;mx=a[0].num;
	for(int i=1;i<cnt;i++){
		if(mx>a[i].num){
			mx+=a[i].num+1,ans++;
		}
		else if(mx==a[i].num){
			if(mxa>=a[i].val)
				ans++;
			else 
				ans=1;
			mx+=a[i].num+1;
		}
		else {
			mx+=a[i].num+1;ans=1;
		}
		
	}
	printf("%d\n",ans);
	return 0;;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章