单词的划分
Time Limit:1s Memory Limit:1000k
Total Submit:2558 Accepted:1134
下载样例程序(PE)
下载样例程序(ELF)
Problem
有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。
出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。
Input
第一行为一整数T,表示有T组测试数据。
每组测试数据第一行为一字符串。(长度小于256)
第二行为一整数N。(1<=N<=100)
以下N行,每行一个单词。
Output
一个整数,表示字符串可以被划分成的最少的单词数。
Sample Input
1 realityour 5 real reality it your our
Sample Output
2
C解答和结果
#include <stdio.h>
#include <string.h>
char Words[100][50];
char *PWord[100];
int StartPos[26];
int N;
int DividWord(char* start)
{
int i;
char *p, *q;
int min = 256, temp;
for(i = StartPos[*start-'a']; i < N; i++){
p = PWord[i];
q = start;
while(*p && *q){
if(*p == *q);
else if(*p != *q) break;
p++; q++;
}
if(*p == 0){
if(*q){
temp = DividWord(q);
if(temp + 1 < min) min = temp+1;
}else min = 1;
}else if(*q == 0){
break;
}else{
if(*p > *q) break;
}
}
return min;
}
int main()
{
int Count;
int i, j;
char *p, Line[256];
scanf("%d", &Count);
gets(Line);
while(Count-- > 0){
gets(Line);
scanf("%d", &N);
gets(Words[0]);
for(i = 0; i < 26; i++) StartPos[i] = 100;
for(i = 0; i < N; i++){
gets(Words[i]);
PWord[i] = Words[i];
}
for(i = 0; i < N-1; i++)
for(j = i+1; j < N; j++)
if(strcmp(PWord[i], PWord[j]) > 0){
p = PWord[i]; PWord[i] = PWord[j]; PWord[j] = p;
}
for(i = 0; i < N; i++){
if(StartPos[*PWord[i]-'a'] == 100) StartPos[*PWord[i]-'a'] = i;
else if(strcmp(PWord[StartPos[*PWord[i]-'a']], PWord[i]) > 0)
StartPos[*PWord[i]-'a'] = i;
}
printf("%d/n", DividWord(Line));
}
return 0;
}
Memory: 40K
Time: 19ms