动态字典树_字串标记查找+大数(HDU_4099)
#include <stdio.h> #include <string.h> #include <string> using namespace std; #define MU 10 #define WLEN 100 #define M 100000 struct node{ int id; node *child[MU]; node() { id = -1; memset(child,NULL,sizeof(child)); } }; char fnMap[3][WLEN] = {"1","1"}; void clear(node *root) { for(int i=0; i<MU; i++) { if(root->child[i] != NULL) clear(root->child[i]); } delete root; } void insert(node *root, char *str, int addId) { node *p = root; int len = strlen(str); for(int i=0; i<len && i<40; i++) { int k = str[i] - '0'; if(p->child[k] == NULL) { p->child[k] = new node; } p = p->child[k]; if(p->id < 0) { p->id = addId; } } } int find(node *root, char *str) { node *p = root; int len = strlen(str); for(int i=0; i<len; i++) { int k = str[i] - '0'; if(p->child[k] == NULL) { return -1; } p = p->child[k]; } return p->id; } void add(char *aStr, char *bStr, char *cStr)//aStr + bStr = cStr { int ai = strlen(aStr)-1,bi = strlen(bStr)-1,ci = 0; int all,over = 0; for(; ai>=0 || bi>=0; ai--,bi--) { all = (ai>=0 ? aStr[ai] : '0') + (bi>=0 ? bStr[bi] : '0') + over - 2 * '0'; cStr[ci++] = all % 10 + '0'; over = all / 10; } if(over > 0) cStr[ci++] = over + '0'; cStr[ci] = '\0'; strrev(cStr); } void init(node *root) { //fnMap[0] = "1",fnMap[1] = "1"; insert(root,fnMap[0],0); insert(root,fnMap[1],1); for(int i=2; i<M; i++) { int aLen = strlen(fnMap[0]); int bLen = strlen(fnMap[1]); if(bLen > 60) { fnMap[0][aLen-1] = fnMap[1][bLen-1] = '\0'; } add(fnMap[0],fnMap[1],fnMap[2]); insert(root,fnMap[2],i); memcpy(fnMap[0],fnMap[1],sizeof(fnMap[0])); memcpy(fnMap[1],fnMap[2],sizeof(fnMap[1])); } } int main(int argc, char* argv[]) { #ifdef __MYLOCAL freopen("in.txt","r",stdin); #endif int t; char findStr[WLEN]; node *root = new node; init(root); scanf("%d",&t); for(int i=1; i<=t; i++) { scanf("%s",findStr); printf("Case #%d: %d\n",i,find(root,findStr)); } clear(root); return 0; }