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 }
有子串,然后
时间: 2024-11-10 11:56:08