zoukankan      html  css  js  c++  java
  • Minimum Expression of String 字符串最小表示

      十分详细的解释:http://hi.baidu.com/kfkkwlhvxcadotr/item/14a46a2b1f889e152a0f1c5f

    几道相关例题的代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cassert>
     4 #include <algorithm>
     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 <cstdio>
     2 #include <cstring>
     3 #include <cassert>
     4 #include <algorithm>
     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 <cstdio>
     2 #include <cstring>
     3 #include <cassert>
     4 #include <algorithm>
     5 #include <set>
     6 #include <string>
     7 
     8 using namespace std;
     9 
    10 set<string> 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 <cstdio>
     2 #include <cstring>
     3 #include <cassert>
     4 #include <algorithm>
     5 #include <set>
     6 #include <string>
     7 
     8 using namespace std;
     9 
    10 set<string> 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

  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/LyonLys/p/minExp_Lyon.html
Copyright © 2011-2022 走看看