Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int maxn = 160 * 80;// sum of length of all patterns...
- string ss[MAX],str;int sz,to[maxn][30],link[maxn];vi ending[maxn];int End[200],len;
- void CLEAR(){
- sz = 0;
- mem(to,0);
- mem(link,0);
- mem(End,0);
- for(int i = 0;i<maxn;i++)ending[i].clear();
- }
- void Insert(string s,int indx){
- int curr = 0;
- for(int i = 0;i<(int)s.length();i++){
- int id = s[i] - 'a';
- if(!to[curr][id])to[curr][id] = ++sz;
- curr = to[curr][id];
- }
- ending[curr].pb(indx);
- }
- void propagate(int pos){
- for(auto it : ending[link[pos]]){
- ending[pos].pb(it);
- }
- }
- void failure()
- {
- int curr = 0;
- link[curr] = -1;
- queue<int>q;
- q.push(curr);
- while(!q.empty()){
- int x = q.front();
- q.pop();
- for(int i = 0;i<26;i++){
- if(!to[x][i])continue;
- if(!x)link[to[x][i]] = 0;
- else {
- int y = x;
- while(link[y]!=-1){
- if(to[link[y]][i]){
- link[to[x][i]] = to[link[y]][i];
- break;
- }
- y = link[y];
- }
- if(link[y]==-1)link[to[x][i]] = 0;
- }
- propagate(to[x][i]);
- q.push(to[x][i]);
- }
- }
- }
- void Search(){
- int curr = 0;
- int indx = 0;
- while(indx<len){
- int id = str[indx] - 'a';
- while(curr!=-1&&!to[curr][id])curr = link[curr];
- if(curr==-1)curr = 0;
- curr = to[curr][id];
- for(int i = 0;i<ending[curr].size();i++){
- End[ending[curr][i]]++;
- }
- indx++;
- }
- }
- int main()
- {
- booster()
- ///read("input.txt");
- while(1){
- CLEAR();
- int n;
- cin>>n;
- if(!n)break;
- for(int i = 0;i<n;i++){
- cin>>ss[i];
- Insert(ss[i],i);
- }
- failure();
- cin>>str;
- len = str.length();
- Search();
- int mx = 0;
- for(int i = 0;i<n;i++){
- mx = max(mx,End[i]);
- }
- cout<<mx<<endl;
- for(int i = 0;i<n;i++){
- if(mx==End[i])cout<<ss[i]<<endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement