您的位置:首页 > 其它

HDU1251(统计难题)

2016-06-12 10:02 357 查看
题目链接:传送门

题目大意:中文题(大意略)

题目思路:tire入门题

用数组代替指针模拟字典树(代码易写,速度快)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 50005
#define maxn 400005
typedef pair<int,int> PII;
char s[111];
struct Trie{
int ch[maxn][26],alloc;   ///alloc是节点变量,为节点之间建立联系
int val[maxn],cur;        ///cur是当前正在访问的节点
int i,len;
void clc(){       ///字典树初始化操作
cur=0;
alloc=1;
mst(val,0);
mst(ch,-1);
}
void add(){       ///扩充节点(向树里增加新节点)
for(;i<len;++i){
ch[cur][s[i]-'a']=alloc++;
cur=ch[cur][s[i]-'a'];
++val[cur];
}
}
void ins(){       ///扩充节点的值(扩充已有节点的值)
len=strlen(s);
cur=0;
for(i=0;i<len;++i){
if(ch[cur][s[i]-'a']==-1) add();
else{
cur=ch[cur][s[i]-'a'];
++val[cur];
}
}
}
int query(){     ///询问
len=strlen(s);
cur=0;
for(i=0;i<len;++i){
if(ch[cur][s[i]-'a']==-1)return 0;
cur=ch[cur][s[i]-'a'];
}
return val[cur];
}
}trie;

int main(){
int i,j,group;
trie.clc();
//freopen("in.txt","r",stdin);
while(gets(s)&&strlen(s))
trie.ins();
while(gets(s)&&strlen(s)){
printf("%d\n",trie.query());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: