【问题描述】近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件。
该算法如下:对一个长度为n的字符串S,首先根据它构造n个字符串,其中第i个字符串由将S的前i-1个字符置于末尾得到。然后把这n个字符串按照首字符从小到大排序,如果两个字符串的首字符相等,则按照它们在S中的位置从小到大排序。排序后的字符串的尾字符可以组成一个新的字符串S’,它的长度也是n,并且包含了S中的每一个字符。最后输出S’以及S的首字符在S’中的位置p。
【输入文件】输入文件filezip.in包含两行,第1行是一个整数n(1 <=n<=80),代表S的长度,第2行是字符串S。
【输出文件】
输出文件filezip.out包含两行,第1行是S’,第2行是整数p。
【输入样例】
7
example
【输出样例】
xelpame
7
【样例说明】长度为7的字符串example经转换后变为xelpame,example的首字符在新字符串中的位置是7。
int main()
{
char a,s[100],b[100],t[100],k;
int n,i,y,x=1,j,c[100];
FILE fpin,fpout;
fpin=fopen("filezip.in","r");
fpout=fopen("filezip.out","w");
fscanf(fpin,"%d",&n);
a=(char)malloc(sizeof(char)n);
for(i=0;i<100;i++)
s[i]=(char)malloc(sizeof(char)n);
fgets(a,n,fpin);
strcpy(s[0],a);
for( ; ;x++){
k=a[0];
for(i=0;i<n-1;i++)
a[i]=a[i+1];
a[n-1]=k;
if(strcmp(s[0],a)==0)
break;
else
strcpy(s[x],a);
}
for(i=0;i<n;i++){
for(j=i;j<n;j++){
if(strcmp(s[j],s[j+1])>0){
strcpy(t,s[j]);
strcpy(s[j],s[j+1]);
strcpy(s[j+1],t);
}
}
}
j=0;
for(i=0;i<n;i++)
b[i]=*(s[i]+n-1);
fputs(b,fpout);
for(i=0;i<n;i++){
if(b[i]=a[0])
c[j++]=i+1;
}
y=c[0];
for(i=0;i<j;i++)
y=(y>c[i])?y:c[i];
fprintf(fpout,"%d",y);
fclose(fpin);
fclose(fpout);
getchar();
getchar();
return 0;
}