Immediate Decodability HDU - 1305(模板trie)
求这些01串是否有一个是另一个的前缀。。
就是求次数就好了嘛。。。emm。。。
网上竟然都用指针写。。。。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define maxn 2000010 #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; int tot, n, m, rt; int trie[maxn][2], sum[400001]; char str[1010][1010]; //bool vis[maxn];查询整个单词用 void build(char *s) { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { int x=s[i]-'0'; if(trie[rt][x]==0)//现在插入的字母在之前同一节点处未出现过 { trie[rt][x]=++tot;//字母插入一个新的位置,否则不做处理 } sum[trie[rt][x]]++; //前缀后移一个位置保存前缀出现的次数 rt=trie[rt][x];//为下个字母的插入做准备 } /*vis[rt]=true;标志该单词末位字母的尾结点,在查询整个单词时用到*/ } int qp(char *s) { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { int x=s[i]-'0'; if(trie[rt][x]==0)return 0;//以rt为头结点的x字母不存在,返回0 rt=trie[rt][x];//为查询下个字母做准备 } // cout<< sum[rt] <<endl; return sum[rt]; //查询整个单词时,应该return vis[rt] , 查询前缀出现的次数时,应该return sum[rt] } void init() { tot = 0; mem(trie, 0); mem(sum, 0); } int main() { init(); int kase = 1, cnt = 0; while(scanf("%s",str[++cnt])!=EOF) { if(strcmp(str[cnt],"9")==0){ bool flag=true; for(int i=1;i<cnt;i++){ // cout<< temp <<endl; if(qp(str[i])>1) { flag=false; break; } } // cout << flag <<endl; if(flag) printf("Set %d is immediately decodable\n",kase++); else printf("Set %d is not immediately decodable\n",kase++); init(); cnt = 0; continue; } build(str[cnt]); } return 0; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。