| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一直MLE。。。。。蛋疼。。谁改改吧#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <cctype>
#include <vector>
using namespace std;
#define MAXN 75005
#define MLEN 52
const int cheat[26] = {5,7,6,3,0,4,9,9,6,1,7,8,5,1,8,8,1,2,3,4,7,6,2,2,3,9};
struct tans
{
vector<string> data;
};
vector<tans> ANS;
char str[MAXN][MLEN];
vector<int> st[MLEN];
int buff[MAXN];
struct Tire
{
Tire *child[10];
vector<int> jmp;
}*root;
Tire * new_Tire()
{
Tire *ret = new Tire;
ret->jmp.clear();
memset(ret->child,0,sizeof(ret->child));
return ret;
}
inline int letter_to_num(char x)
{
return cheat[x-'a'];
}
void insert(Tire *root,char *str,int&pos)
{
if (*str)
{
if (isalpha(*str))
{
int tmp = letter_to_num(tolower(*str));
if (!root->child[tmp])
root->child[tmp] = new_Tire();
insert(root->child[tmp],str+1,pos);
}
else
insert(root,str+1,pos);
}
else
root->jmp.push_back(pos);
}
void track(vector<int>*st,int &pos,int &len,char *str,Tire*root)
{
int t = pos;
Tire *p = root;
while (t < len && p->child[str[t]-'0'])
{
p = p->child[str[t]-'0'];
if (p->jmp.size())
st[t+1].push_back(pos);
t++;
}
}
tans ttt;
void make_up(int *buff,int pos,Tire*root,char*pstr)
{
if (pos)
{
Tire *p = root;
int t = buff[pos];
while (t < buff[pos-1])
{
p = p->child[pstr[t]-'0'];
t++;
}
for (int i=0;i<p->jmp.size();i++)
{
string tmp = str[p->jmp[i]];
ttt.data.push_back(tmp);
make_up(buff,pos-1,root,pstr);
ttt.data.pop_back();
}
}
else
ANS.push_back(ttt);
}
void find_solve(vector<int>*st,int pos,int deep,Tire*root,char *str)
{
buff[deep] = pos;
if (pos != 0)
for (int i=0;i<st[pos].size();i++)
find_solve(st,st[pos][i],deep+1,root,str);
else
{
ttt.data.clear();
make_up(buff,deep,root,str);
}
}
bool cmp(const tans a,const tans b)
{
for (int i=0;i<min(a.data.size(),b.data.size());i++)
if (strcmp(a.data[i].c_str(),b.data[i].c_str())<0)
return true;
else
if (strcmp(a.data[i].c_str(),b.data[i].c_str())>0)
return false;
return a.data.size()<b.data.size();
}
void DESTORY(Tire*root)
{
if (root)
{
for (int i=0;i<10;i++)
DESTORY(root->child[i]);
delete root;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
#endif
int nCase;
scanf("%d",&nCase);
for (int nc=0;nc<nCase;nc++)
{
root = new_Tire();
int ndic , np;
scanf("%d",&ndic);
for (int i=0;i<ndic;i++)
scanf("%s",str[i]),insert(root,str[i],i);
scanf("%d",&np);
printf("Scenario #%d:\n",nc+1);
while (np--)
{
ANS.clear();
char pt[51];
char new_pt[51];
scanf("%s",pt);
int p = 0;
int len = strlen(pt);
for (int i=0;i<len;i++)
if (isdigit(pt[i]))
new_pt[p++] = pt[i];
for (int i=0;i<MLEN;i++)
st[i].clear();
st[0].push_back(0);
for (int i=0;i<p;i++)
if (st[i].size())
track(st,i,p,new_pt,root);
if (st[p].size())
{
find_solve(st,p,0,root,new_pt);
sort(ANS.begin(),ANS.end(),cmp);
for (int i=0;i<ANS.size();i++)
{
printf("%s:",pt);
for (int j=0;j<ANS[i].data.size();j++)
printf(" %s",ANS[i].data[j].c_str());
puts("");
}
}
else
printf("%s cannot be encoded.\n",pt);
}
puts("");
DESTORY(root);
}
#ifndef ONLINE_JUDGE
cerr << "DONE." << endl;
#endif
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator