单词数

本文解析了一道来自HDU ACM在线评测系统的字符串匹配题目,采用Trie树进行字符串的高效存储与检索。通过逐行读取输入并利用Trie树进行插入操作,实现了对不同单词的计数。代码中详细展示了Trie树节点的定义、插入和查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=2072 

/*#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstdio>*/
#include<bits/stdc++.h>
using namespace std;

#define sfi(i) scanf("%d",&i)
#define sfl(i) scanf("%lld",&i)
#define sfs(i) scanf("%s",(i))
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
#define MOD(x) ((x%mod)+mod)%mod
#define endl '\n'
#define pb push_back
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

/*
//---------------------------------------------------------
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
*/

//gp_hash_table<string,int>mp2;
//__gnu_pbds::priority_queue<int>q;//因为放置和std重复,故需要带上命名空间
//__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag> pq;//最快
//----------------------------------------------------------



//----------------------------------------------------------
const int BufferSize = 1 << 16;
char buffer[BufferSize], *_head, *_tail;
inline char Getchar() {
    if (_head == _tail) {
        int l = fread(buffer, 1, BufferSize, stdin);
        _tail = (_head = buffer) + l;
    }
    return *_head++;
 }
inline int read() {
    int x = 0, f = 1;char c = Getchar();
    for (;!isdigit(c);c = Getchar()) if (c == '-') f = -1;
    for (;isdigit(c);c = Getchar()) x = x * 10 + c - '0';
    return x * f;
 }
//----------------------------------------------------------




const int maxn=2e6+9;
const int mod=1e9+7;

int tree[maxn][39],sum[maxn];
bool flagg[maxn];
int tot;

int ans=0;
void insert_str(char *str)
{
    int len=strlen(str);
    int rt=0;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(!tree[rt][id]) tree[rt][id]=++tot;
        rt=tree[rt][id];
    }
    if(!flagg[rt]) ans++;
    flagg[rt]=1;
}
int find_str(char *str)
{
    int len=strlen(str);
    int rt=0;
    for(int i=0;i<len;i++)
    {
        int id=str[i]-'a';
        if(!tree[rt][id]) return 0;
        rt=tree[rt][id];
    }
    return sum[rt];
}
void init()
{
    for(int i=0;i<=tot;i++)
    {
        flagg[i]=0;
        for(int j=0;j<30;j++) tree[i][j]=0;
    }
    tot=0;
}
char s[maxn];
char tmp[maxn];
int main()
{
    //FAST_IO;

    //freopen("input.txt","r",stdin);




    while(gets(s))
    {
        if(s[0]=='#')
        {
            break;
        }
        init();
        ans=0;
        int cnt=0;
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            if(s[i]==' '&&!cnt) continue;
            if(s[i]==' '&&cnt)
            {
                tmp[cnt]='\0';
                insert_str(tmp);
                //cout<<tmp<<endl;
                cnt=0;
                continue;
            }
            else
            {
                tmp[cnt]=s[i];
                cnt++;
            }
        }
        if(cnt) insert_str(tmp);
       // cout<<tmp<<endl;;
       printf("%d\n",ans);
    }

    return 0;
}

 

<think>好的,用户想统计文本中的单词量,询问如何在程序中实现。我需要根据他们提供的引用资料,整理出具体的方法步骤。 首先,用户提到了Python和C语言的例子,可能希望得到不同语言的解决方案。但问题本身没有限定语言,所以应该先给出通用的步骤,再分别用不同语言示例说明。 引用1中的Python代码示例展示了统计文件的行、句子单词。不过用户主要关注单词量,可能需要简化代码。通常,英语文本的单词以空格或标点分隔,所以步骤可能包括读取文件、分割单词、统计量。需要注意的是,标点符号的处理可能会影响结果,比如忽略标点或者将其从单词中剔除。 引用2中的C语言代码使用结构体存储单词和计,通过检查是否存在来决定是否新增或增加计。这可能涉及更复杂的单词统计,比如统计每个单词的出现次,但用户的问题只是总,所以可以简化。 引用3提到输入英文语句统计单词量的运行流程,可能包括分割字符串、过滤空字符等步骤。这进一步确认了基本方法:分割字符串成单词组,然后计算长度。 接下来,我需要将这些步骤整理出来,分点说明。首先通用方法,然后Python示例,再C语言示例。需要注意不同语言中的实现差异,比如Python的split()方法可能更简洁,而C需要手动处理字符串。 在Python中,读取文件内容后用split()分割单词,但split()默认以空白字符分割,可能包括多个空格或换行符,需要处理。例如,用户提供的Python代码中使用len(words)来统计单词,但可能需要更严谨的处理,比如去除标点符号。 在C语言中,需要逐个字符读取,判断是否为字母,遇到非字母时结束当前单词,并计。这需要处理连续的非字母字符,比如多个空格或标点。例如,引用2中的代码可能使用状态变量来跟踪是否在单词中,遇到分隔符时增加计。 另外,用户可能希望知道如何处理边缘情况,比如连字符、缩写等。不过根据引用资料,可能不需要涉及这些复杂情况,保持基本的分割即可。 最后,确保代码示例正确,并符合用户提供的引用内容。例如,Python中的split()可能不够精确,但用户提供的例子中使用了类似的方法,所以可以沿用,同时提醒可能的改进点,如使用正则表达式处理更复杂的情况。 总结步骤: 1. 读取文本内容。 2. 分割成单词(按空格或标点)。 3. 统计有效单词量。 然后分别用Python和C语言实现,并说明注意事项,比如标点处理、大小写等。</think>在程序中统计文本单词量的通用步骤如下: ### 一、实现原理 1. **文本预处理**:将文本中的标点符号替换为空格,统一分隔符[^3] 2. **单词分割**:通过空格等分隔符将文本拆分为单词组 3. **有效计**:过滤空字符串和纯字等非单词元素 4. **统计输出**:计算组长度得到单词 ### 二、Python实现 ```python def count_words(text): # 替换标点为空格 for char in '!?.,;:"': text = text.replace(char, ' ') # 分割单词并过滤空值 words = [word for word in text.split() if word.isalpha()] return len(words) # 示例用法 text = "Hello world! This is a test." print(count_words(text)) # 输出 5 ``` ### 三、C语言实现 ```c #include <stdio.h> #include <ctype.h> int count_words(const char* text) { int count = 0; int in_word = 0; while (*text) { if (isalpha(*text)) { if (!in_word) { count++; in_word = 1; } } else { in_word = 0; } text++; } return count; } int main() { char text[] = "Hello world! This is a test."; printf("%d", count_words(text)); // 输出5 return 0; } ``` ### 四、注意事项 1. 处理连字符时需特殊判断(如"state-of-the-art"应视为一个单词) 2. 字与字母混合的字符串是否视为有效单词需根据需求决定 3. 大小写处理:建议统一转为小写后再统计[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值