hihocoder 1441

http://hihocoder.com/problemset/problem/1441

题目:对SAM的介绍,模拟暴力实现SAM的一些功能。

思路:找出S字符串的所有的子串,

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <string>
 4 #include <iostream>
 5 #include <map>
 6 using namespace std;
 7 map<string,long long >dist;
 8 map<long long ,string>Long,Short;
 9 
10 /*
11 substr(s_pos,s_size);
12 */
13 int main()
14 {
15     string s;
16     int t;
17     cin>>s>>t;
18     for(int i = 0;i<s.length();i++)
19         for(int j = 1;j<=s.length()-i;j++)
20         {
21             string x = s.substr(i,j);
22             long long tmp = 0;                   //tmp代表x与哪几个字符串相同。
23             for(int k = 0;k<=s.length()-j;k++)
24             {
25                 if(x==s.substr(k,j))
26                     tmp |= (1ll<<(k+j));    //k+j代表有相同的后缀,与运算就可以把这个值给记录下来
27             }
28             if(Short[tmp].length()==0||(int)Short[tmp].length()>j)
29                 Short[tmp] = x;
30             if((int)Long[tmp].length()<j)
31                 Long[tmp] = x;
32             dist[x] = tmp;
33         }
34     string x;
35     while(t--)
36     {
37         cin>>x;
38         long long tmp = dist[x];
39         cout<<Short[tmp]<<" "<<Long[tmp];
40         for(int i = 0;i<50;i++)
41             if((1ll<<i)&tmp)
42                 cout<<" "<<i;
43         cout<<endl;
44     }
45     return 0;
46 }

有子串,然后

原文地址:https://www.cnblogs.com/Tree-dream/p/6868161.html