↓ Skip to main content
  1. Posts/

hdu 1251 统计难题 (trie树模板题)

·475 words·1 min
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

hdu 1251 题目链接

题意:先给一个单词表,然后给出若干查询,每个查询一个单词,问单词表中以这个单词为前缀的单词的个数。

思路:trie树裸题。第一次写trie树。。感觉要注意的是trie树是一个比较耗费空间的数据结构。。? 以及动态开辟内存记得free…?

代码实现
  1/* ***********************************************
  2Author :111qqz
  3Created Time :2016年08月14日 星期日 19时58分41秒
  4File Name :code/hdu/1251.cpp
  5************************************************ */
  6
  7#include <cstdio>
  8#include <cstring>
  9#include <iostream>
 10#include <algorithm>
 11#include <vector>
 12#include <queue>
 13#include <stack>
 14#include <set>
 15#include <map>
 16#include <string>
 17#include <cmath>
 18#include <cstdlib>
 19#include <deque>
 20#include <ctime>
 21#define fst first
 22#define sec second
 23#define lson l,m,rt<<1
 24#define rson m+1,r,rt<<1|1
 25#define ms(a,x) memset(a,x,sizeof(a))
 26typedef long long LL;
 27#define pi pair < int ,int >
 28#define MP make_pair
 29
 30using namespace std;
 31const double eps = 1E-8;
 32const int dx4[4]={1,0,0,-1};
 33const int dy4[4]={0,-1,1,0};
 34const int inf = 0x3f3f3f3f;
 35char s[20];
 36
 37struct Trie
 38{
 39    struct Node
 40    {
 41	Node *nxt[26];
 42	int cnt;
 43	Node()
 44	{
 45	    for ( int i = 0 ; i < 26;  i++) nxt[i]=NULL;
 46	    cnt = 0 ;
 47	}
 48    };
 49    Node *root;
 50    void init()
 51    {
 52	root = new Node();
 53    }
 54    Trie()
 55    {
 56	root = new Node();
 57    }
 58    void Insert(char *s)
 59    {
 60	Node *u = root;
 61	int len = strlen(s);
 62	for ( int i = 0 ; i < len ; i++)
 63	{
 64	    int v = s[i]-'a';
 65	    if (u->nxt[v]==NULL) u->nxt[v]=new Node();
 66	    u = u->nxt[v];
 67	    u->cnt++;
 68	}
 69    }
 70    int Find(char *s)
 71    {
 72	Node *u = root;
 73	int len = strlen(s);
 74	for ( int i = 0 ; i < len ; i++)
 75	{
 76	    int v = s[i]-'a';
 77	    if (u->nxt[v]==NULL) return 0;
 78	    u = u->nxt[v];
 79	}
 80	return u->cnt;
 81    }
 82
 83}trie;
 84int main()
 85{
 86	#ifndef  ONLINE_JUDGE
 87	freopen("code/in.txt","r",stdin);
 88  #endif
 89
 90	while (gets(s))
 91	{
 92	    int len = strlen(s);
 93	    if (len==0) break;
 94	    trie.Insert(s);
 95	}
 96	while (gets(s))
 97	{
 98	    int ans = trie.Find(s);
 99	    printf("%d\n",ans);
100	}
101
102  #ifndef ONLINE_JUDGE
103  fclose(stdin);
104  #endif
105    return 0;
106}

Related

hdu 5833 || ccpc 2016 网络赛 1002 Zhu and 772002 (高斯消元)

·528 words·2 mins
hdu 5833 题目链接 题意:n个数,保证每个数的素因子不超过2000,从中取若干个,问乘积是完全平方数的方案数。 思路: 完全平方数就是要求每个质因子的指数是偶数次。 列方程组,a1,a2,a3……am分别表示bi是否在集合中。对于每一个素因子,建立异或方程组,要求因子个数为偶数,即异或为0

hdu 5835 || ccpc 2016 网络赛 1004 Danganronpa (模拟)

·561 words·2 mins
hdu 5835 题目链接 题意:n种礼物,每种a[i]个。现在有无穷个小朋友排成一排,分给每个人一个“普通”的礼物,一个“昂贵”的礼物(哪个普通哪个昂贵是自己定的,或者说,任意的) 要求是相邻的小朋友的普通的礼物不能是同一种。现在问最多能给多少小朋友分礼物。。。

hdu 5842 || 2016 ccpc 网络赛 1011 Lweb and String(set)

·385 words·1 min
hdu 5842题目链接 题意:给一个只由小写字母组成的字符串,每个字符映射到一个数字,问映射之后的最长上升子序列的长度。。 思路:上来写nlogn的LIS是我无脑了。。。wa了之后想了下。。其实只要统计不同的字母数就好了啊。。。set一下

hdu 3374 String Problem (字符串的最小/大表示法+kmp)

·544 words·2 mins
hdu 3374 题目链接 题意:给出一个循环字符串,问最小表示出现的位置以及次数,最大表示出现的位置以及次数。 思路:之前只写过最小表示。。最大表示其实是一样的。。。把不等式方向变号即可。。。对于出现的次数。。。其实就等同于这个字符串是由几个子串组成。。。跑一遍kmp。。答案为len-nxt[len],1A

hdu 2609 How many (字符串的最小表示法+set)

·362 words·1 min
hdu 2609 题目链接 题意:给出n个循环字符串,问有多少种。 思路:将每个字符串换成最小表示,然后set存一下即可。 代码实现 1/* *********************************************** 2Author :111qqz 3Created Time :2016年08月13日 星期六 02时44分21秒 4File Name :code/hdu/2609.cpp 5************************************************ */ 6#include <cstdio> 7#include <cstring> 8#include <iostream> 9#include <algorithm> 10#include <vector> 11#include <queue> 12#include <stack> 13#include <set> 14#include <map> 15#include <string> 16#include <cmath> 17#include <cstdlib> 18#include <deque> 19#include <ctime> 20#define fst first 21#define sec second 22#define lson l,m,rt<<1 23#define rson m+1,r,rt<<1|1 24#define ms(a,x) memset(a,x,sizeof(a)) 25typedef long long LL; 26#define pi pair < int ,int > 27#define MP make_pair 28using namespace std; 29const double eps = 1E-8; 30const int dx4[4]={1,0,0,-1}; 31const int dy4[4]={0,-1,1,0}; 32const int inf = 0x3f3f3f3f; 33const int N=1E4+7; 34int n; 35char s[N][105]; 36set<string>se; 37int minRep(char *s) 38{ 39 int n = strlen(s); 40 int i = 0 ; 41 int j = 1 ; 42 int k = 0 ; 43 while (i<n&&j<n&&k<n) 44 { 45 int t = s[(i+k)%n] - s[(j+k)%n]; 46 if (t==0) k++; 47 else 48 { 49 if (t>0) 50 i+=k+1; 51 else j+=k+1; 52 if (i==j) j++; 53 k = 0 ; 54 } 55 } 56 return i<j?i:j; 57} 58int main() 59{ 60 #ifndef ONLINE_JUDGE 61 freopen("code/in.txt","r",stdin); 62 #endif 63 while (~scanf("%d",&n)) 64 { 65 ms(s,0); 66 se.clear(); 67 // cout<<"n:"<<n<<endl; 68 char tmp[105]; 69 for ( int i = 0 ; i < n; i++) 70 { 71 scanf("%s",tmp); 72// cout<<"tmp:"<<tmp<<endl; 73 int k = minRep(tmp); 74// cout<<"k:"<<k<<endl; 75 int cnt = 1; 76 int len = strlen(tmp); 77 for ( int j = k ; cnt <= len ; j++,cnt++) 78 s[i][cnt-1] = tmp[j%len]; 79 se.insert(string(s[i])); 80 } 81// for ( int i = 0 ; i < n; i++) cout<<"s[i]:"<<s[i]<<endl; 82// 83 int ans = se.size(); 84 printf("%d\n",ans); 85 } 86 #ifndef ONLINE_JUDGE 87 fclose(stdin); 88 #endif 89 return 0; 90}