uva 1519 Dictionary Size
来源:互联网 发布:sql alter 编辑:程序博客网 时间:2024/06/06 08:50
题意:有一个字典,字典有很多单词,要求组合成新词,新词必须来源于原字典,或者由原词的非空前缀和非空后缀组成。
思路:建立trie树,则可以求出不同的前缀和后缀有多少个,但是直接相乘并不是答案,考虑有可能重复的,如XXXAXXX,则A可以选前缀和后缀各一次,XXXA、XXX或者XXX、XXXA,则应该减去。
现在考虑普遍情况,XXXbbb,bbbXXX,若只考虑重复b的情况,假设左边x个b,右边y个b,不考虑重复情况左边应为(1+x)选择,右边应为(1+y)选择,则总共应有这么(1+x)*(1+y)多种情况,但是实际情况应该只有1+x+y种情况,(b的数量,X为任意字符),则应该减去x*y种情况。
还有一个要注意的是如果出现单独的字符,应该标记,建立trie树的时候,不会把单个字符算进去。
#include<cstdio>#include<cstring>#include<algorithm>#define mem(name,value) memset(name,value,sizeof(name))#define FOR(i,n) for(int i=1;i<=n;i++)using namespace std;const int maxn = 400000+5;const int sigma_size = 26;struct Trie{ int ch[maxn][sigma_size]; int cnt[sigma_size]; int sz; int init(){ mem(ch[0],0); mem(cnt,0); sz = 1; } int idx(char c){return c-'a';} void insert(const char *s){ int n = strlen(s),u=0; for(int i=0;i<n;i++){ int c = idx(s[i]); if(!ch[u][c]){ mem(ch[sz],0); ch[u][c] = sz++; if(i) cnt[c]++; } u = ch[u][c]; } }}pre,suf;char s[100];bool vis[26];int main(){ //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)==1){ mem(vis,false); pre.init(); suf.init(); for(int i=0;i<n;i++){ scanf("%s",s); if(strlen(s)==1) vis[s[0]-'a']=1; pre.insert(s); reverse(s,s+strlen(s)); suf.insert(s); } long long ans = (long long)(pre.sz-1)*(suf.sz-1); for(int i=0;i<sigma_size;i++) ans -= (long long)pre.cnt[i]*suf.cnt[i]; for(int i=0;i<sigma_size;i++) if(vis[i]) ans++; printf("%lld\n",ans); } return 0;}
0 0
- uva 1519 Dictionary Size
- UVA 1519 - Dictionary Size(Trie树)
- uva 1519 - Dictionary Size(字典树)
- poj 4025 Dictionary Size
- UVALive - 5913 Dictionary Size
- Neerc2011 Dictionary Size
- dictionary changed size during iteration
- UVALive 5913 Dictionary Size (Trie)
- UVALive 5913 Dictionary Size 解题报告
- UVALive 5913 【NEERC 2011 D】 Dictionary Size
- Python 字典 dictionary changed size during iteration
- python RuntimeError: dictionary changed size during iteration
- python3 RuntimeError: dictionary changed size during iteration
- uva Andy's First Dictionary
- UVA - 12504 Updating a Dictionary
- UVa 12504 - Updating a Dictionary
- UVA - 12504 Updating a Dictionary
- Uva - 12504 - Updating a Dictionary
- SyntaxError: identifier starts immediately after numeric literal
- 回归教育本质 培养实用型人才——记杭州年代专修学校
- Xenomai 2.6.4 发布, 支持 Atmel SAMA5D3
- 量初始化列表
- cocos2dx 添加 libiconv.lib 解决 字符转换问题
- uva 1519 Dictionary Size
- 渍综姿嘴着妆转咨谆字钻奏字走足紫纵撞
- 奏爪孜注综妆淄谆卓醉籽撞组追状阻琢族
- opencv中RGB转HSV
- android应用程序第一次启动时显示引导界面
- hdu2096小明A+B
- Android百度地图之自定义绘制功能
- 自从遇见你开始吧
- iOS: How To Make AutoLayout Work On A ScrollView