单词的划分

单词的划分

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值