Description
每个数字串都可以被压缩成c1 d1 c2 d2 … cn dn的形式,如果一个串被压缩几次之后和自己相同则称之为self-inventorying,对于一个串n有三种情况:
1. n压缩1次就马上出现self-inventorying特性,即 n n n n n n n …..
2. n压缩j次后的数字串J出现self-inventorying特性,即 n A B C….H I J J J J J J J
3. n压缩j次后的数字串J,每再压缩K次,重新出现数字串J,即n A B… J ..K J ..K J..K J
其中K称为循环间隔,K>=2
现给出一个数字串,判断其属于以上哪一种
Input
多组用例,每组用例占一行为一长度不超过80的数字串,以-1结束输入
Output
对于每组用例,判断该串属于哪种情况
Sample Input
22
31123314
314213241519
21221314
111222234459
-1
Sample Output
22 is self-inventorying
31123314 is self-inventorying
314213241519 enters an inventory loop of length 2
21221314 is self-inventorying after 2 steps
111222234459 enters an inventory loop of length 2
Solution
水题
Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 111
char s[22][maxn];
void deal(char *s1,char *s2)
{
int len=strlen(s1),num[11],res=0;
memset(num,0,sizeof(num));
for(int i=0;i<len;i++)
num[s1[i]-'0']++;
for(int i=0;i<10;i++)
if(num[i])
{
if(num[i]>9)s2[res++]=num[i]/10+'0',num[i]%=10;
s2[res++]=num[i]+'0';
s2[res++]=i+'0';
}
s2[res]='\0';
}
int main()
{
while(~scanf("%s",s[0]),s[0][0]!='-')
{
int f1,f2,f3;
f1=f2=f3=0;
for(int i=1;i<=15;i++)deal(s[i-1],s[i]);
if(!strcmp(s[0],s[1]))f1=1;
if(!f1)
{
for(int i=1;i<15;i++)
if(!strcmp(s[i],s[i+1]))
{
f2=i;
break;
}
if(!f2)
{
for(int i=1;i<=15;i++)
{
for(int j=0;j<=i-2;j++)
if(!strcmp(s[i],s[j]))
{
f3=i-j;
break;
}
if(f3)break;
}
}
}
if(f1)printf("%s is self-inventorying\n",s[0]);
else if(f2)printf("%s is self-inventorying after %d steps\n",s[0],f2);
else if(f3)printf("%s enters an inventory loop of length %d\n",s[0],f3);
else printf("%s can not be classified after 15 iterations\n",s[0]);
}
return 0;
}