zoj 1825 Compound Words

    技术2025-04-23  26

    给出一系列单词,如果一个词是由其他两个词连接而成的就输出,输入输出都是按字典序来的。

     

    第一反应是用字典树,昨晚敲了敲感觉差不多,就是网被断了没法交 = =。。。

     

    今早交了后一直WA,要么超内存。就用了malloc。

     

    我一直很纳闷,如果有 a  ab  abc b c 这几个单词,那么abc是否要输出呢?找了个标程 = =。。网上的都是用STL做的。。。好短。。。

     

    结果呢,是要输出的,那我的程序就错了 = =。。。改了改。如果这个单词中前x个字母是一个单词,就查后面的是否组成一个单词。是的话就输出,不是的话,x++继续找。。

     

    AC了,爆了下RP跑了10ms。。。排了第六~

     

    应该学下STL了。。。YM。。。

     

    #include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> #define MAX 120002 using namespace std; typedef struct TRIE{ int end; TRIE *next[26]; }TRIE; TRIE *head,*p; void init() { int k; p = (TRIE*)malloc(sizeof(TRIE)); for(k=0; k<26; k++) p->next[k] = NULL; p->end = 0; } void Build(char *str) { int i,to,k; int len = strlen(str); head = p; for(i=0; i<len; i++) { to = str[i] - 'a'; if( head->next[to] == NULL ) { head->next[to] = (TRIE*)malloc(sizeof(TRIE)); for(k=0; k<26; k++) head->next[to]->next[k] = NULL; head->next[to]->end = 0; } head = head->next[to]; } head->end = 1; } int compound(char *str) { int len = strlen(str); int k,i,too; TRIE *tmp = p; for(i=0; i<len-1; i++) { int to = str[i]-'a'; if( tmp->next[to]->end == 1 ) { k = i+1; head = p; while( k != len ) { too = str[k]-'a'; if( head->next[too] != NULL ) head = head->next[too]; else break; k++; } if( k == len && head->end == 1 ) return 1; } tmp = tmp->next[to]; } return 0; } char s[MAX][15]; int main() { int num = 0,i; init(); while( ~scanf("%s",s[num]) ) { Build(s[num]); num++; } for(i=0; i<num; i++) if( strlen(s[i]) > 1 ) { if( compound(s[i]) == 1 ) puts(s[i]); } return 0; }  

    最新回复(0)