• 模板 最小表示法


    字符串的最小表示在hash 等领域有应用

    模板代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using std::min;
     5 char str[100000];
     6 int main()
     7 {
     8     scanf("%s",str);
     9     int len=strlen(str);
    10     int i=0,j=1,k=0;
    11     while(i<len&&j<len&&k<len)
    12     {
    13         int t=str[(i+k)%len]-str[(j+k)%len];
    14         if(!t)
    15             k++;
    16         else{
    17             if(t>0)
    18                 i+=k+1;
    19             else
    20                 j+=k+1;
    21             if(i==j)
    22                 j++;
    23             k=0;
    24         }
    25     }
    26     int sta=min(i,j);
    27     for(int i=sta;i<len;i++)
    28         putchar(str[i]);
    29     for(int i=0;i<sta;i++)
    30         putchar(str[i]);
    31     putchar('
    ');
    32     return 0;
    33 }

    HDU2609

    最小表示法裸上。

    双模hash一下存map里

    代码:

     1 #include<map>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using std::map;
     6 using std::min;
     7 using std::swap;
     8 using std::pair;
     9 using std::make_pair;
    10 typedef unsigned long long lnt;
    11 const lnt sd1=18321973;
    12 const lnt sd2=32984721;
    13 map<pair<lnt,lnt>,bool>M;
    14 char str[10000];
    15 lnt tmp[100000];
    16 int n;
    17 int main()
    18 {
    19     while(scanf("%d",&n)!=EOF)
    20     {
    21         M.clear();
    22         int cnt=0;
    23         for(int i=1;i<=n;i++)
    24         {
    25             scanf("%s",str+1);
    26             int len=strlen(str+1);
    27             int a1=1;
    28             int a2=2;
    29             int ln=0;
    30             while(a1<=len&&a2<=len&&ln<len)
    31             {
    32                 int t=str[(a1+ln-1)%len+1]-str[(a2+ln-1)%len+1];
    33                 if(!t)
    34                     ln++;
    35                 else{
    36                     if(t<0)
    37                         a1+=ln+1;
    38                     else
    39                         a2+=ln+1;
    40                     if(a1==a2)
    41                         a2++;
    42                     ln=0;
    43                 }
    44             }
    45             int sta=min(a1,a2);
    46             int l=0;
    47             for(int i=sta;i<=len;i++)
    48                 tmp[++l]=str[i];
    49             for(int i=1;i<sta;i++)
    50                 tmp[++l]=str[i];
    51             lnt ax=0,ay=0;
    52             for(int i=1;i<=len;i++)
    53             {
    54                 ax=ax*sd1+tmp[i];
    55                 ay=ay*sd2+tmp[i];
    56             }
    57             if(ax>ay)
    58                 swap(ax,ay);
    59             pair<lnt,lnt>x=make_pair(ax,ay);
    60             if(M.find(x)==M.end())
    61                 cnt++;
    62             M[x]=true;
    63         }
    64         printf("%d
    ",cnt);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    hadoop运维
    HBase Master启动过程
    bulk-load 装载HDFS数据到HBase
    HBase开启LZO
    Hash函数
    swift菜鸟入门视频教程-02-基本运算符
    当当网-前端project师測试题
    VB.NET & DataGridView与数据库的连接
    Hadoop-2.2.0中文文档—— Common
    PHP 获取数组随意下标key的上一个prev和下一个next下标值
  • 原文地址:https://www.cnblogs.com/blog-Dr-J/p/9702804.html
Copyright © 2020-2023  润新知