Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include <iostream>
- #define K 1000000
- struct node {
- int children[26];
- char isWord;
- char best[30];
- char sbest[30];
- };
- bool flag;
- struct node Trie[K];
- int trieNodeCount;
- using namespace std;
- char c;
- int initialize() {
- trieNodeCount = 1;
- }
- int add(char *word, int length,char *rword) {
- int i, curNode = 1, nextNode;
- for (i=0; i<length; i++) {
- nextNode = Trie[curNode].children[ word[i] - 'a' ];
- if ( nextNode == 0 ) {
- trieNodeCount++;
- Trie[curNode].children[ word[i] - 'a' ] = trieNodeCount;
- curNode = trieNodeCount;
- }
- else {
- curNode = nextNode;
- }
- // swap function
- if (strcmp(Trie[curNode].best,rword)>0||!strlen(Trie[curNode].best)) {
- for (int i=0;i<strlen(Trie[curNode].best);i++) {
- Trie[curNode].sbest[i]=Trie[curNode].best[i];
- }
- for (int i=strlen(Trie[curNode].best);i<strlen(Trie[curNode].sbest);i++)
- Trie[curNode].sbest[i]=c;
- for (int i=0;i<strlen(rword);i++) {
- Trie[curNode].best[i]=rword[i];
- }
- for (int i=strlen(rword);i<strlen(Trie[curNode].best);i++)
- Trie[curNode].best[i]=c;
- // end of swap function
- }
- else
- // second swap function
- if (strcmp(Trie[curNode].best,rword)<=0&&(strcmp(Trie[curNode].sbest,rword)>0||!strlen(Trie[curNode].sbest))) {
- for (int i=0;i<strlen(rword);i++) {
- Trie[curNode].sbest[i]=rword[i];
- }
- for (int i=strlen(rword);i<strlen(Trie[curNode].sbest);i++)
- Trie[curNode].sbest[i]=c;
- }
- // end of second swap function
- }
- Trie[curNode].isWord = 1;
- }
- void query(char *word, int length,char *rword) {
- int i, curNode = 1,ansNode=1,see;
- for (i=0; i<length; i++) {
- curNode = Trie[curNode].children[ word[i] - 'a' ];
- if ( curNode == 0 )
- break;
- if (strcmp(rword,Trie[curNode].best)!=0) {
- ansNode=curNode;
- see=0;
- }
- else
- if (strlen(Trie[curNode].sbest)) {
- ansNode=curNode;
- see=1;
- }
- }
- if (!see)
- printf("%s\n",Trie[ansNode].best);
- else
- printf("%s\n",Trie[ansNode].sbest);
- }
- int main () {
- //freopen("prhyme.out","w",stdout);
- // freopen("prhyme.in","r",stdin);
- initialize();
- while(1) {
- char s[31],rs[31];
- for (int i=0;i<31;i++) {
- s[i]=c;
- rs[i]=c;
- }
- gets(s);
- int n=strlen(s);
- if( !strcmp(s,"") )
- break;
- for (int i=0;i<n;i++) {
- rs[i]=s[n-(i+1)];
- }
- add(rs,n,s);
- }
- while(!feof(stdin)) {
- char s[31],rs[31];
- for (int i=0;i<31;i++) {
- s[i]=c;
- rs[i]=c;
- }
- gets(s);
- int n=strlen(s);
- for (int i=0;i<n;i++) {
- rs[i]=s[n-(i+1)];
- }
- query(rs,strlen(rs),s);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment