博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Minimum Expression of String 字符串最小表示
阅读量:6678 次
发布时间:2019-06-25

本文共 4024 字,大约阅读时间需要 13 分钟。

  十分详细的解释:

 

几道相关例题的代码:

1 #include 
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 char buf[100001]; 9 10 int minExp(char *s) {11 int i = 0, j = 1, k = 0, t;12 int len = strlen(s);13 14 while (i < len && j < len && k < len) {15 t = s[(i + k) % len] - s[(j + k) % len];16 if (!t) {17 k++;18 } else {19 if (t > 0) i = i + k + 1;20 else {21 j = j + k + 1;22 }23 if (i == j) j++;24 k = 0;25 }26 //printf("%d %d %d\n", i, j, k);27 }28 29 return min(i, j);30 }31 32 int main() {33 int T, n;34 35 scanf("%d", &T);36 while (T-- && ~scanf("%d %s", &n, buf)) {37 printf("%d\n", minExp(buf));38 memset(buf, 0, sizeof(buf));39 }40 41 return 0;42 }
zoj 1729

 

1 #include 
2 #include
3 #include
4 #include
5 6 using namespace std; 7 8 char buf[10001]; 9 10 int minExp(char *s) {11 int i = 0, j = 1, k = 0, t;12 int len = strlen(s);13 14 while (i < len && j < len && k < len) {15 t = s[(i + k) % len] - s[(j + k) % len];16 if (!t) {17 k++;18 } else {19 if (t > 0) i = i + k + 1;20 else {21 j = j + k + 1;22 }23 if (i == j) j++;24 k = 0;25 }26 //printf("%d %d %d\n", i, j, k);27 }28 29 return min(i, j) + 1;30 }31 32 int main() {33 int T;34 35 scanf("%d", &T);36 while (T-- && ~scanf("%s", buf)) {37 printf("%d\n", minExp(buf));38 memset(buf, 0, sizeof(buf));39 }40 41 return 0;42 }
zoj 2006

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 using namespace std; 9 10 set
cnt;11 char buf[101];12 13 int minExp(char *s) {14 int i = 0, j = 1, k = 0, t;15 int len = strlen(s);16 17 while (i < len && j < len && k < len) {18 t = s[(i + k) % len] - s[(j + k) % len];19 if (!t) {20 k++;21 } else {22 if (t > 0) i = i + k + 1;23 else {24 j = j + k + 1;25 }26 if (i == j) j++;27 k = 0;28 }29 //printf("%d %d %d\n", i, j, k);30 }31 32 return min(i, j);33 }34 35 void con(char *a){36 int pos = minExp(a);37 int len = strlen(a);38 char tmp[101];39 40 strcpy(tmp, a);41 for (int i = 0; i < len; i++){42 a[i] = tmp[(pos + i) % len];43 }44 }45 46 int deal(int n){47 cnt.clear();48 for (int i = 0; i < n; i++){49 scanf("%s", buf);50 con(buf);51 cnt.insert(buf);52 }53 54 return cnt.size();55 }56 57 int main(){58 int n;59 60 while (~scanf("%d", &n)){61 printf("%d\n", deal(n));62 }63 64 return 0;65 }
hdu 2609

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 using namespace std; 9 10 set
cnt;11 char buf[300001], tmp[300001];12 13 int minExp(char *s) {14 int i = 0, j = 1, k = 0, t;15 int len = strlen(s);16 17 while (i < len && j < len && k < len) {18 t = s[(i + k) % len] - s[(j + k) % len];19 if (!t) {20 k++;21 } else {22 if (t > 0) i = i + k + 1;23 else {24 j = j + k + 1;25 }26 if (i == j) j++;27 k = 0;28 }29 //printf("%d %d %d\n", i, j, k);30 }31 32 return min(i, j);33 }34 35 void work() {36 int len = strlen(buf);37 38 tmp[0] = (buf[0] - buf[len - 1] + 8) % 8 + '0';39 for (int i = 1; i < len; i++){40 tmp[i] = (buf[i] - buf[i - 1] + 8) % 8 + '0';41 }42 43 int pos = minExp(tmp);44 45 for (int i = 0; i < len; i++) {46 buf[i] = tmp[(pos + i) % len];47 }48 }49 50 int main() {51 while (~scanf("%s", buf)) {52 work();53 printf("%s\n", buf);54 }55 56 return 0;57 }
hdu 4162

 

 

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/09/21/minExp_Lyon.html

你可能感兴趣的文章
接口測试-HAR
查看>>
$.each 和$(selector).each()的区别
查看>>
45435
查看>>
JSON格式自动解析遇到的调用方法问题.fromJson() ..readValue()
查看>>
Crystal Reports for Visual Studio 2015 安装
查看>>
iOS UI 15 网络编程下载 图片 音乐 大文件 视频 get/ post方法
查看>>
linux文件系统 - 初始化(二)
查看>>
Python的可视化图表工具集
查看>>
《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》
查看>>
Python的优点与功能
查看>>
三个文件,
查看>>
webpack的总结
查看>>
hibernate 一级缓存和二级缓存
查看>>
javac不是内部或外部命令
查看>>
mvc SelectList selected失效的解决方法
查看>>
JAVA 设计模式 中介者模式
查看>>
我的软件工程课目标
查看>>
var a={n:1}; var b=a; a.x=a={n:2}; console.log(a.x); console.log(b.x);
查看>>
【HDOJ】3016 Man Down
查看>>
window.open打开新页面,并将本页数据用过url传递到打开的页面;需要两个页面;...
查看>>