发现漏了很多知识,处理完这个就去看看二叉树…
放个学习链接`点这里
整完这些再去补一补01字典树
要学的好多啊…
HDU1251统计难题
int tree[maxn][27];
int sum[maxn],tot;
void insert(char str[]){
int pos=0;
int root=0;
while(str[pos]!='\0'){
int id=str[pos]-'a'+1;
if(tree[root][id]==0){
tree[root][id]=++tot;
}
sum[tree[root][id]]++;
pos++;
root=tree[root][id];
}
}
int query(char str[]){
int pos=0,root=0;
while(str[pos]!='\0'){
int id=str[pos]-'a'+1;
if(!tree[root][id]){
return 0;
} else {
root = tree[root][id];
}
pos++;
}
return sum[root];
}
void solve(){
tot=0,ms(tree,0),ms(sum,0);
char str[15];
while(gets(str)&&str[0]!='\0'){
insert(str);
//de(str);
}
while(gets(str)){
printf("%d\n",query(str));
}
}
HDU2072单词数
可含连续空格…我吐了
int tree[maxn][27];
int sum[maxn],tot;
char str[maxn];
void insert(string tmp){
int sz=tmp.size();
int root=0;
for(int i=0;i<=sz-1;i++){
int id=tmp[i]-'a'+1;
if(!tree[root][id]){
tree[root][id]=++tot;
}
root=tree[root][id];
//sum[root]++;
}
sum[root]++;
}
bool check(string tmp){
int sz=tmp.size();
int root=0;
for(int i=0;i<=sz-1;i++){
int id=tmp[i]-'a'+1;
if(!tree[root][id]){
return false;
}
root=tree[root][id];
}
if(sum[root]){
return true;
} else {
return false;
}
}
void solve(){
while(gets(str)){
if(str[0]=='#'){
break;
}
// getchar();
//de(str);
tot=0;
string tmp;
int len=strlen(str);
//de(str);
int ans=0;
for(int i=0;i<len;i++){
if(str[i]==' '){
continue;
}
//if(i==0||str[i]==' ')
int j=i;
tmp="";
while(j<len&&str[j]!=' '){
tmp+=str[j++];
}
i=j;
//de(tmp);
if(!check(tmp)){
ans++;
insert(tmp);
}
//}
}
printf("%d\n",ans);
for(int i=0;i<=tot;i++){
sum[i]=0;
for(int j=1;j<=26;j++){
tree[i][j]=0;
}
}
}
}
getline写法
int tree[maxn][27];
int sum[maxn],tot;
void insert(string tmp){
int sz=tmp.size();
int root=0;
for(int i=0;i<=sz-1;i++){
int id=tmp[i]-'a'+1;
if(!tree[root][id]){
tree[root][id]=++tot;
}
root=tree[root][id];
//sum[root]++;
}
sum[root]++;
}
bool check(string tmp){
int sz=tmp.size();
int root=0;
for(int i=0;i<=sz-1;i++){
int id=tmp[i]-'a'+1;
if(!tree[root][id]){
return false;
}
root=tree[root][id];
}
if(sum[root]){
return true;
} else {
return false;
}
}
void solve(){
string pp;
while(getline(cin,pp)&&pp!="#"){
tot=0;
int ans=0;
ms(tree,0),ms(sum,0);
stringstream str(pp);
string tmp;
while(str>>tmp){
if(!check(tmp)){
ans++;
insert(tmp);
}
}
cout<<ans<<endl;
}
}