• 10.26—11.1


    1.Phone List(trie/easy)

    //2015.10.26 09:55

     1 //注意用静态建树,动态建树超时
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <string>
     5 #include <vector>
     6 #include <map>
     7 #include <cstdlib>
     8 #include <cstring>
     9 
    10 using namespace std;
    11 
    12 struct TrieNode
    13 {
    14     int next[10];
    15     bool flag;
    16     bool ed;
    17     TrieNode()
    18     {
    19         ed = false;
    20         flag = false;
    21         memset(next, 0, sizeof(next));
    22     }
    23 };
    24 TrieNode trie[600050];
    25 int cnt = 1;
    26 
    27 int main()
    28 {
    29     int t;
    30 
    31     scanf("%d", &t);
    32     while (t--)
    33     {
    34         cnt = 1;
    35         memset(trie, 0, sizeof(trie));
    36         int n;
    37         bool ans = true;
    38         scanf("%d", &n);
    39         char ch[15];
    40         memset(ch, 0, sizeof(ch));
    41         while (n--)
    42         {
    43             scanf("%s", ch);
    44             int len = strlen(ch);
    45             int tf = 0;
    46             for (int i = 0; i < len; ++i)
    47             {
    48                 if (trie[tf].next[ch[i]-'0'] == 0)
    49                 {
    50                     trie[tf].next[ch[i]-'0'] = cnt;
    51                     cnt++;
    52                 }
    53                 tf = trie[tf].next[ch[i]-'0'];
    54                 if (i == len-1 && trie[tf].flag) ans = false;
    55                 if (trie[tf].ed) ans = false;
    56                 trie[tf].flag = true;
    57             }
    58             trie[tf].ed = true;
    59         }
    60         puts(ans ? "YES" : "NO");
    61     }
    62 
    63     return 0;
    64 }
    View Code

     2.Constellations(hash/trie/kmp)

    //2015.10.26 21:24

     1 //把字符hash成long数
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <string>
     5 #include <vector>
     6 #include <map>
     7 #include <cstdlib>
     8 #include <cstring>
     9 #include <set>
    10 
    11 using namespace std;
    12 
    13 int n, m, t, p, q;
    14 char mp[1010][1010];
    15 long long h[1010][1010];
    16 char tmp[55];
    17 long long a[55];
    18 
    19 int ok()
    20 {
    21     for (int i = 0; i+p-1 < n; ++i)
    22     {
    23         for (int j = q-1; j < m; ++j)
    24         {
    25             int flag = 1;
    26             for (int k = 0; k < p; ++k)
    27             {
    28                 if (h[i+k][j] != a[k])
    29                 {
    30                     flag = 0;
    31                     break;
    32                 }
    33             }
    34             if (flag) return true;
    35         }
    36     }
    37     return false;
    38 }
    39 
    40 
    41 int main()
    42 {
    43     int ncas = 1;
    44     while (~scanf("%d%d%d%d%d", &n, &m, &t, &p, &q))
    45     {
    46         if (n+m+t+p+q == 0) break;
    47         for (int i = 0; i < n; ++i)
    48             scanf("%s", mp[i]);
    49         memset(h, 0, sizeof(h));
    50         for (int i = 0; i < n; ++i)
    51             for (int j = 0; j < q; ++j)
    52             {
    53                 if (mp[i][j] == '*') h[i][q-1] |= (1LL << j);
    54             }
    55         for (int i = 0; i < n; ++i)
    56         {
    57             for (int j = q; j < m; ++j)
    58             {
    59                 if (mp[i][j-q] == '*') h[i][j] = h[i][j-1]-1LL;
    60                 else h[i][j] = h[i][j-1];
    61                 h[i][j] >>= 1LL;
    62                 if (mp[i][j] == '*') h[i][j] |= (1LL << (q-1));
    63             }
    64         }
    65         int cnt = 0;
    66         while (t--)
    67         {
    68             for (int i = 0; i < p; ++i)
    69             {
    70                 scanf("%s", tmp);
    71                 a[i] = 0;
    72                 for (int j = 0; j < q; ++j)
    73                     if (tmp[j] == '*') a[i] |= (1LL << j);
    74             }
    75             if (ok()) cnt++;
    76         }
    77         printf("Case %d: %d
    ", ncas++, cnt);
    78     }
    79 
    80     return 0;
    81 }
    hash

    用kmp总是TLE不知为啥,代码先贴到这

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <string>
     4 #include <vector>
     5 #include <map>
     6 #include <cstdlib>
     7 #include <cstring>
     8 #include <set>
     9 
    10 using namespace std;
    11 
    12 int n, m, t, p, q;
    13 
    14 char ch1[1000010];
    15 char ch2[50*55+10];
    16 int nxt[50*55+10];
    17 
    18 void getNext()
    19 {
    20     nxt[0] = -1;
    21     int j = -1, len = strlen(ch2);
    22     for (int i = 1; i < len; ++i)
    23     {
    24         while (j >= 0 && ch2[i] != ch2[j+1]) j = nxt[j];
    25         if (ch2[j+1] == ch2[i]) j++;
    26         nxt[i] = j;
    27     }
    28 }
    29 
    30 int judge()
    31 {
    32     int j = -1, len1 = strlen(ch1), len2 = strlen(ch2);
    33     for (int i = 0; i < len1; ++i)
    34     {
    35         while (j >= 0 && ch2[j+1] != ch1[i] && ch2[j+1] != '#') j = nxt[j];
    36         if ((ch2[j+1] == ch1[i])) j++;
    37         if (j+1 == len2) return 1;
    38         if (ch2[j+1] == '#') j++, i += m-q;
    39     }
    40     return 0;
    41 }
    42 
    43 int main()
    44 {
    45     int ncas = 1;
    46     while (~scanf("%d%d%d%d%d", &n, &m, &t, &p, &q))
    47     {
    48         map<string, int> mp;
    49         if (n+m+t+p+q == 0) break;
    50         for (int i = 0; i < n; ++i)
    51             scanf("%s", ch1+i*m);
    52         int ans = 0;
    53         while (t--)
    54         {
    55             for (int i = 0; i < p; ++i)
    56             {
    57                 scanf("%s", ch2+i*(q+1));
    58                 if (i != p-1)
    59                     ch2[(i+1)*(q+1)-1] = '#';
    60             }
    61             if (mp.count(ch2) == 0)
    62             {
    63                 getNext();
    64                 int ret = judge();
    65                 mp[ch2] = ret;
    66                 ans += ret;
    67             }
    68             else ans += mp[ch2];
    69         }
    70         printf("Case %d: %d
    ", ncas++, ans);
    71     }
    72 
    73     return 0;
    74 }
    kmp

     3.Long Long Message(后缀数组)

    //2015.10.29 08:35

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <string>
     4 #include <vector>
     5 #include <map>
     6 #include <cstdlib>
     7 #include <cstring>
     8 #include <set>
     9 
    10 using namespace std;
    11 
    12 const int maxn = 200010;
    13 int dp[maxn][33];
    14 int wa[maxn], wb[maxn], wsf[maxn], wv[maxn], sa[maxn];
    15 int rank[maxn], height[maxn], s[maxn];
    16 char str[maxn], str1[maxn];
    17 
    18 int cmp(int *r, int a, int b, int k)
    19 {
    20     return r[a] == r[b] && r[a+k] == r[b+k];
    21 }
    22 
    23 void getsa(int *r, int *sa, int n, int m)
    24 {
    25     int i, j, p, *x = wa, *y = wb, *t;
    26     for (i = 0; i < m; ++i) wsf[i] = 0;
    27     for (i = 0; i < n; ++i) wsf[x[i]=r[i]]++;
    28     for (i = 1; i < m; ++i) wsf[i] += wsf[i-1];
    29     for (i = n-1; i >= 0; --i) sa[--wsf[x[i]]] = i;
    30     p = j = 1;
    31     for ( ; p < n; j *= 2, m = p)
    32     {
    33         for (p = 0, i = n-j; i < n; ++i) y[p++] = i;
    34         for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i]-j;
    35         for (i = 0; i < n; ++i) wv[i] = x[y[i]];
    36         for (i = 0; i < m; ++i) wsf[i] = 0;
    37         for (i = 0; i < n; ++i) wsf[wv[i]]++;
    38         for (i = 1; i < m; ++i) wsf[i] += wsf[i-1];
    39         for (i = n-1; i >= 0; --i) sa[--wsf[wv[i]]] = y[i];
    40         t = x;
    41         x = y;
    42         y = t;
    43         x[sa[0]] = 0;
    44         for (p = 1, i = 1; i < n; ++i)
    45             x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p-1 : p++;
    46     } 
    47 }
    48 
    49 void  getheight(int *r, int n)
    50 {
    51     int i, j, k = 0;
    52     for (i = 1; i <= n; ++i)
    53         rank[sa[i]] = i;
    54     for (i = 0; i < n; ++i)
    55     {
    56         if (k) k--;
    57         else k = 0;
    58         j = sa[rank[i]-1];
    59         while (r[i+k] == r[j+k]) k++;
    60         height[rank[i]] = k;
    61     }
    62 }
    63 
    64 int main()
    65 {
    66     while (~scanf("%s", str))
    67     {
    68         scanf("%s", str1);
    69         int n = 0, len = strlen(str);
    70         for (int i = 0; i < len; ++i)
    71             s[n++] = str[i]-'a'+1;
    72         s[n++] = 28;
    73         len = strlen(str1);
    74         for (int i = 0; i < len; ++i)
    75             s[n++] = str1[i]-'a'+1;
    76         s[n] = 0;
    77         getsa(s, sa, n+1, 30);
    78         getheight(s, n);
    79         int maxx = 0, pos = 0;
    80         len = strlen(str);
    81         for (int i = 2; i < n; ++i)
    82             if (height[i] > maxx)
    83             {
    84                 if (0<=sa[i-1] && sa[i-1]<len && len<sa[i])
    85                     maxx = height[i];
    86                 if (0<=sa[i] && sa[i]<len && len<sa[i-1])
    87                     maxx = height[i];
    88             }
    89         printf("%d
    ", maxx);
    90     }
    91 
    92     return 0;
    93 }
    View Code
  • 相关阅读:
    HttpUtils
    其实就是这么回事
    Spring 、 CXF 整合 swagger 【试炼】
    Jetty 学习记录
    WebSphere 学习记录
    Apache 学习记录
    WebLogic 学习记录
    Hessian 学习记录
    IntelliJ IDEA学习记录
    IntelliJ IDEA学习记录
  • 原文地址:https://www.cnblogs.com/JustForCS/p/4910357.html
Copyright © 2020-2023  润新知