#pragma GCC optimize ("O3") #pragma pack (16)//所有的存储都是以16个字节为单位的 #include <stdio.h> #include <stdlib.h> #include <string.h> #define tolower(c) (c>='A'&&c<='Z')?c-'A'+'a':c #define DATA 5200000 #define SIZE 1000005 int trie[4200000][26]; typedef struct node { int cnt; int logo; struct node *child[26]; } Node; Node *root; char str[35000000]; typedef struct word { char wor[85]; int cnt; } Word; Word w[300000]; struct node *creat() { Node *Root = (Node *)malloc(sizeof(Node)); Root->logo = 0; Root->cnt = 0; for (int i = 0; i < 26; i++) { Root->child[i] = NULL; } return Root; } void insert(Node *root, char *word, int flag) { struct node *leaf = root; for (int i = 0; word[i] != '\0'; i++) { int index = word[i] - 'a'; if (!leaf->child[index]) { leaf->child[index] = creat(); } leaf = leaf->child[index]; } if (leaf->logo != -1) leaf->logo = flag; leaf->cnt++; } int count = 0; void dfs(Node *leaf, char *word, int level) { if (leaf->logo == 1) { word[level] = '\0'; strcpy(w[count++].wor, word); w[count - 1].cnt = leaf->cnt; } for (int i = 0; i < 26; i++) { if (leaf->child[i]) { word[level] = i + 'a'; dfs(leaf->child[i], word, level + 1); } } } int cmp(const void *p1, const void *p2) { Word *v1, *v2; v1 = (Word *)p1; v2 = (Word *)p2; if (v1->cnt != v2->cnt) return v2->cnt - v1->cnt; else return strcmp(v1->wor, v2->wor); } int main(int argc, char *argv[]) { char s[1024]; int temp; int n, m;//读入n,m; //n = atoi(argv[1]); //m = atoi(argv[2]); scanf("%d%d", &n, &m); //读入stopwords中的元素,并令末序数组值为0,即该单词不计入 root = creat(); FILE *stopwords = fopen("stopwords.txt", "r"); while (fscanf(stopwords, "%s", s) != EOF) { insert(root, s, -1); } int cnt; FILE *article = fopen("article.txt", "r"); cnt = fread(str, sizeof(char), 35000000, article); char word[85]; int w_cnt = 0; for (int i = 0; i < cnt; i++) { char c = tolower(str[i]); if (c >= 'a' && c <= 'z') { word[w_cnt++] = c; } else { word[w_cnt] = '\0'; p = 0; w_cnt = 0; if (strlen(word) > 0) { insert(root, word, 1); } }//对article中的所有单词进行计数 } dfs(root, word, 0); qsort(w, count, sizeof(w[0]), cmp); printf("%s", w[0].cnt); return 0; }
时间: 2023-06-24 17:07:05 浏览: 67
这段代码是一个基于Trie树的单词统计程序,在给定的文章中统计出现频率最高的单词。程序从文件中读入stopwords(不计入统计的常用单词)和article(待统计的文章),使用Trie树统计文章中出现的单词频率,并按照出现频率从高到低输出结果。
具体实现中,程序使用了一个结构体Node表示Trie树中的节点,其中包含了该节点出现次数cnt和单词编号logo。同时,程序定义了一个结构体Word表示单词及其出现次数。程序中的insert函数用于向Trie树中插入单词,dfs函数用于遍历Trie树并统计单词出现次数,cmp函数用于按照出现频率从高到低排序输出结果。
注意,程序中的一些细节需要注意,比如将所有字母转换为小写字母,以及对于长度为0的单词不进行计数等。
相关问题
#pragma GCC optimize("O2") #pragma GCC optimize("O3") #pragma GCC optimize("Ofast")
#pragma GCC optimize("O2")是GCC编译器的一个指令,用于优化代码以提高执行速度和减少代码大小。它告诉编译器使用O2级别的优化。O2级别是GCC编译器的一个优化级别,它会进行更多的优化,但可能会增加编译时间。
#pragma GCC optimize("O3")是GCC编译器的另一个指令,用于进一步优化代码以提高执行速度和减少代码大小。它告诉编译器使用O3级别的优化。O3级别是GCC编译器的最高优化级别,它会进行更多的优化,但可能会增加编译时间。
#pragma GCC optimize("Ofast")是GCC编译器的另一个指令,用于启用所有的优化选项,包括O3级别的优化以及其他一些特定于目标机器的优化。它可以进一步提高执行速度,但可能会牺牲代码大小。
这些指令可以在代码中的任何位置使用,并且只对紧随其后的代码块起作用。它们可以用于整个文件、特定的函数或者特定的代码块。
请注意,使用这些优化指令可能会导致代码的行为发生变化,因此在使用之前请确保对代码进行了充分的测试。
#pragma GCC optimize(3,"","")
在给出的引用中,没有提及到"#pragma GCC optimize(3,"","")"这个具体的编译指令。因此,我无法提供关于该指令的具体信息和解释。请提供更多关于该指令的上下文或其他相关信息,以便我可以更好地回答您的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [openwrt GCC 编译错误:error: #pragma GCC diagnostic not allowed inside functions](https://blog.csdn.net/u012385733/article/details/81535366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]