程序设计实习递归作业 poj 2334 Simple prefix compression(模拟/字符串处理)
总时间限制: 2000ms 内存限制: 65536kB
描述
Many databases store the data in the character fields (and especially indices) using prefix compression. This technique compresses a sequence of strings A1, …, AN by the following method: if there are strings Ai = ai,1ai,2…ai,p and Ai + 1 = ai+1,1ai+1,2…ai+1,q
such that for some j ≤ min(p, q) ai,1 = ai+1,1, ai,2 = ai+1,2, … ai,j = ai+1,j, then the second string is stored as [j]ai+1,j+1ai+1,j+2… ai+1,q, where [j] is a single character with code j.
If j = 0, that is, strings do not have any common prefix, then the second string is prefixed with zero byte, and so the total length actually increases.
Constraints
1 ≤ N ≤ 10000, 1 ≤ length(Ai) ≤ 255.
输入
First line of input contains integer number N, with following N lines containing strings A1 … AN
输出
Output must contain a single integer – minimal total length of compressed strings.
样例输入
3
abc
atest
atext
样例输出
11
来源
Northeastern Europe 2003, Far-Eastern Subregion
本题与递归似乎没有直接关系,是一个纯粹的字符串处理题目,关键是审题,要注意即使没有可压缩的也要加上首字0(仔细想想这是符合逻辑的,不然我怎么知道你压缩没压缩),还有注意这种存储方法,即使压缩了15字,我不必存下15,只需要存一个char c=15即可,(仔细想想这是符合逻辑的,不然无法判断哪几位用于记录压缩位数),审题审清楚后可以解决问题。
#define MAX_LEN 255
#include<stdio.h>
#include<string.h>
char last[MAX_LEN+1]="",now[MAX_LEN+1]="";
int n,ans=0,l1=0,l2=0,len=0;
int main()
{
scanf("%d",&n);
while (n--)
{
strcpy(last,now);
l1=l2;
scanf("%s\n",&now);
l2=strlen(now);
len=0;
for (int i=0;i<l1 && i<l2;i++)
{
if (now[i]!=last[i])
break;
len++;
}
ans+=l2-len+1;
}
printf("%d\n",ans-1);
return 0;
}