【2012 - 百度之星资格赛 - H:用户请求中的品牌】
H:用户请求中的品牌
- 查看
- 提交
- 统计
- 提问
- 时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。
- 输入
-
输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。用户请求的长度不大于100,000。
最后一行输入为#,作为结束的标志。 - 输出
- 对于每组输入,先输出这个组的编号(第n组就是输出“Case n:”);然后输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的子串,请选择那个字典序最小的。
- 样例输入
-
ilovejohnsonjohnsonverymuch duckduckgo aaabbbcccisagoodcompany #
- 样例输出
-
Case 1: johnsonjohnson Case 2: duckduck Case 3: aaa
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define MAXD 100010 5 #define INF 0x3f3f3f3f 6 char b[MAXD]; 7 int N, r[MAXD], sa[MAXD], rank[MAXD], height[MAXD], wa[MAXD], wb[MAXD], ws[MAXD], wv[MAXD]; 8 int best[20][MAXD], mm[MAXD], len[MAXD], first[MAXD], P; 9 void init() 10 { 11 int i; 12 for(i = 0; b[i]; i ++) 13 r[i] = b[i]; 14 r[N = i] = 0; 15 } 16 int cmp(int *p, int x, int y, int l) 17 { 18 return p[x] == p[y] && p[x + l] == p[y + l]; 19 } 20 int cmp1(const void *_p, const void *_q) 21 { 22 int i, *p = (int *)_p, *q = (int *)_q; 23 for(i = 0; i < len[*p] && i < len[*q]; i ++) 24 { 25 if(r[first[*p] + i] < r[first[*q] + i]) 26 return -1; 27 else if(r[first[*p] + i] > r[first[*q] + i]) 28 return 1; 29 } 30 if(i == len[*p]) 31 return -1; 32 return 1; 33 } 34 void da(int n, int m) 35 { 36 int i, j, p, *x = wa, *y = wb, *t; 37 memset(ws, 0, sizeof(ws[0]) * m); 38 for(i = 0; i < n; i ++) 39 ++ ws[x[i] = r[i]]; 40 for(i = 1; i < m; i ++) 41 ws[i] += ws[i - 1]; 42 for(i = n - 1; i >= 0; i --) 43 sa[-- ws[x[i]]] = i; 44 for(j = p = 1; p < n; j *= 2, m = p) 45 { 46 for(p = 0, i = n - j; i < n; i ++) 47 y[p ++] = i; 48 for(i = 0; i < n; i ++) 49 if(sa[i] >= j) 50 y[p ++] = sa[i] - j; 51 for(i = 0; i < n; i ++) 52 wv[i] = x[y[i]]; 53 memset(ws, 0, sizeof(ws[0]) * m); 54 for(i = 0; i < n; i ++) 55 ++ ws[wv[i]]; 56 for(i = 1; i < m; i ++) 57 ws[i] += ws[i - 1]; 58 for(i = n - 1; i >= 0; i --) 59 sa[-- ws[wv[i]]] = y[i]; 60 for(t = x, x = y, y = t, x[sa[0]] = 0, i = p = 1; i < n; i ++) 61 x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p ++; 62 } 63 } 64 void calheight(int n) 65 { 66 int i, j, k = 0; 67 for(i = 1; i <= n; i ++) 68 rank[sa[i]] = i; 69 for(i = 0; i < n; height[rank[i ++]] = k) 70 for(k ? -- k : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; k ++); 71 } 72 void initRMQ(int n) 73 { 74 int i, j, x, y; 75 for(mm[0] = -1, i = 1; i <= n; i ++) 76 mm[i] = (i & (i - 1)) == 0 ? mm[i - 1] + 1 : mm[i - 1]; 77 for(i = 1; i <= n; i ++) 78 best[0][i] = i; 79 for(i = 1; i <= mm[n]; i ++) 80 for(j = 1; j <= n - (1 << i) + 1; j ++) 81 { 82 x = best[i - 1][j]; 83 y = best[i - 1][j + (1 << (i - 1))]; 84 best[i][j] = height[x] < height[y] ? x : y; 85 } 86 } 87 int askRMQ(int x, int y) 88 { 89 int t = mm[y - x + 1]; 90 y = y - (1 << t) + 1; 91 x = best[t][x]; 92 y = best[t][y]; 93 return height[x] < height[y] ? height[x] : height[y]; 94 } 95 int calculate(int x, int y) 96 { 97 int t; 98 x = rank[x], y = rank[y]; 99 if(x > y) 100 t = x, x = y, y = t; 101 ++ x; 102 return askRMQ(x, y); 103 } 104 void printresult(int max) 105 { 106 int i, j, k; 107 if(max == 1) 108 { 109 k = INF; 110 for(i = 0; i < N; i ++) 111 if(r[i] < k) 112 k = r[i]; 113 printf("%c\n", k); 114 } 115 else 116 { 117 for(i = 0; i < P; i ++) 118 ws[i] = i; 119 qsort(ws, P, sizeof(ws[0]), cmp1); 120 for(i = 0, k = ws[0]; i < len[k]; i ++) 121 printf("%c", r[first[k] + i]); 122 printf("\n"); 123 } 124 } 125 void solve() 126 { 127 int i, j, k, p, max = 1, ans; 128 da(N + 1, 128); 129 calheight(N); 130 initRMQ(N); 131 for(i = 1; i < N; i ++) 132 for(j = 0; j + i < N; j += i) 133 { 134 ans = calculate(j, j + i); 135 k = j - (i - ans % i); 136 ans = ans / i + 1; 137 if(ans < max - 1 || (ans == max - 1 && calculate(k, k + i) < i)) 138 continue; 139 for(k = ans == max - 1 ? k : j; j - k < i; k --) 140 { 141 ans = calculate(k, k + i); 142 ans = ans / i + 1; 143 if(ans < max) 144 break; 145 if(ans > max) 146 { 147 max = ans; 148 P = 0; 149 } 150 first[P] = k, len[P] = ans * i; 151 ++ P; 152 } 153 } 154 printresult(max); 155 } 156 int main() 157 { 158 int t = 0; 159 for(;;) 160 { 161 scanf("%s", b); 162 if(b[0] == '#') 163 break; 164 printf("Case %d: ", ++ t); 165 init(); 166 solve(); 167 } 168 return 0; 169 }
转载于:https://www.cnblogs.com/ismdeep/archive/2012/05/31/2529116.html
【2012 - 百度之星资格赛 - H:用户请求中的品牌】相关推荐
- 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...
- 【2012百度之星/资格赛】H:用户请求中的品牌
时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johns ...
- 【2012百度之星/资格赛】E:C++ 与Java
时间限制:2000ms 内存限制:65536kB 描述 在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时.Java的爱好者会说他们的程序更加整 ...
- 【2012百度之星资格赛】E:C++ 与Java
时间限制: 2000ms 内存限制: 65536kB 描述 在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时.Java的爱好者会说他们的程序更加整洁 ...
- 【2012百度之星资格赛】F:百科蝌蚪团
时间限制: 1000ms 内存限制: 65536kB 描述 百度百科有一支神奇的队伍,他们叫自己"百科蝌蚪团".为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出了一 ...
- 【2012百度之星资格赛】J:百度的新大厦
时间限制: 1000ms 内存限制: 65536kB 描述 继百度搜索框大厦之后,百度又于2012年初在深圳奠基了新的百度国际大厦,作为未来百度国际化的桥头堡.不同于百度在北京的搜索框大厦,新的 ...
- 【2012百度之星资格赛】G:聊天就是Repeat
时间限制: 1000ms 内存限制: 65536kB 描述 百度Hi作为百度旗下的即时聊天工具,在百度公司内部很是流行.要实现这样的一个聊天工具,最重要的问题就是要能保证我发出的内容能原封不动的 ...
- 【2012百度之星/资格赛】J:百度的新大厦
描述 继百度搜索框大厦之后,百度又于2012年初在深圳奠基了新的百度国际大厦,作为未来百度国际化的桥头堡.不同于百度在北京的搜索框大厦,新的百度国际大厦是一栋高楼,有非常多的楼层,让每个楼中的电梯都能 ...
- 【2012百度之星 / 资格赛】I:地图的省钱计划
描述 百度地图有自己的一套坐标系(你可以把它看作一个笛卡尔坐标系),在这套坐标系里,一个标准单位为1km.而在这坐标系上针对地理信息进行标注的数据,大多数时候是通过购买的方式完成的.为了节约数据更新的 ...
- 【2012百度之星/资格赛】F:百科蝌蚪团
时间限制: 1000ms 内存限制: 65536kB 描述 百度百科有一支神奇的队伍,他们叫自己"百科蝌蚪团".为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出 ...
最新文章
- 远程监控 – 数据采集管道
- 将Integer赋值给int(空指针异常)
- STM32串口中断的4种接收数据的实现方式
- 汇编: loop指令
- tomcat 域名的配置
- Python-OpenCV-- 台式机外接摄像头EAST文本检测+OCR识别
- 【学术相关】供参考:刚刚,2021 世界大学学术排名发布!
- CSS打造很棒的黑色背景下的导航菜单
- 【绝对有用】Syntax error on token “throws“, @ expected after this token
- 如何解决使用JSON.stringify时遇到的循环引用问题
- mysql 索引- 笔记
- mvc如何嵌套第三方页面_长文观点丨为什么我不再使用MVC框架?
- tt协议号服务器,TTIot: TTIoT云端物联网Iot组件;面向JAVA;netty;mqtt;异步推送;以事件为驱动;为设备提供安全可靠的连接通信能力;...
- 人生是自己的选择,双11技术大队长的育女心经
- Spring读取xml配置文件的原理与实现
- python编程入门-Python 基础教程
- siri不能识别语音
- 关于启动Activity之间的及普通按钮的点击事件
- 基于nonebot的QQ群聊机器人制作(一)
- linux qt qpa linuxfb,Qt 5.4带有Tslib的Linux触摸屏输入在Raspberry Pi上无法使用LinuxFB QPA平台插件...
热门文章
- PHP 收货地址:添加、修改、删除
- YAF 菜鸟的学习笔记
- java map 容器_java容器-map的常用实现及原理
- 面试记录:冒泡排序都不会,大哥你会编程吗
- 启用多CPU多线程,加快加速OpenJDK的编译办法
- MAC编译OpenJDK8:ld: library not found for -lstdc++(独家解决办法)
- LINUX下载编译nginx
- 软件基本功:数组赋值,一定要对齐
- Python中,如何使用ImageDraw在Image上绘制粗线?
- Dxg——Raspberry Pi Pico python 开发笔记整理分类合集【所有的相关记录,都整理在此】