您的位置:首页 > 其它

poj1035 字典匹配

2015-01-09 20:55 246 查看
//终于过了,主要思想是强制计算所有可能长度对应的子字典列表。
//用空间换时间 1324K	938MS
#include <iostream>
#include <string>
using namespace std;
string dic[10005];
string check;
int len[10005];
int indexLen[16][10005];
int cntt[16];
int subList[16][10005];
void bubbleSort(int* a, int s)
{
for(int i = 0; i < s - 1; i++)
{
for(int j = 0; j < s - 1 - i; j++)
{
if(a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
bool match(string a, string b)
{
//a字典 b待匹配
if(a.length() > b.length())
{
int cnt = 0;
for(int i = 0; i < b.length(); i++)
{
int j = i + cnt;
if(a[j] != b[i])
{
cnt++;
i--;
if(cnt>1)
break;
}
}
if(cnt <= 1)
return true;
}
else if(a.length() < b.length())
{
int cnt = 0;
for(int i = 0; i < a.length(); i++)
{
int j = i + cnt;
if(b[j] != a[i])
{
cnt++;
i--;
if(cnt > 1)
break;
}
}
if(cnt <= 1)
return true;
}
return false;
}
int main()
{
memset(indexLen, -1, sizeof(indexLen));
memset(cntt, 0, sizeof(cntt));
int k = 1;
getline(cin, dic[0]);
len[0] = (int)dic[0].length();
indexLen[len[0]][cntt[len[0]]++] = 0;
while(dic[k - 1].compare("#") != 0)
{
getline(cin, dic[k]);
len[k] = dic[k].length();
indexLen[len[k]][cntt[len[k]]++] = k;
k++;
}
k--;

//用大堆数据弥补TLE
int subNum[16];
memset(subNum, 0, sizeof(subNum));
for(int j = 1; j < 16; j++)
{
for(int i = 0; j - 1 >= 0 && i < cntt[j - 1]; i++)
{
if(indexLen[j - 1][i] < k)
subList[j][subNum[j]++] = indexLen[j - 1][i];
}
for(int i = 0; i < cntt[j]; i++)
{
if(indexLen[j ][i] < k)
subList[j][subNum[j]++] = indexLen[j][i];
}
for(int i = 0;  i < cntt[j + 1]; i++)
{
if(indexLen[j + 1][i] < k)
subList[j][subNum[j]++] = indexLen[j + 1][i];
}
bubbleSort(subList[j], subNum[j]);
}

getline(cin, check);
while(check.compare("#") != 0)
{
int checkLen = check.length();

cout<<check;
bool ok = false;
for(int i = 0; i < subNum[checkLen]; i++)
{
if(dic[subList[checkLen][i]].compare(check) == 0)
{
cout<<" is correct";
ok = true;
break;
}
}
if(!ok)
{
cout<<":";
for(int i = 0; i < subNum[checkLen]; i++)
{
int cnt = 0;
if(dic[subList[checkLen][i]].length() == checkLen)
{
for(int j = 0; j < checkLen; j++)
if(dic[subList[checkLen][i]][j] != check[j])
cnt++;
if(cnt == 1)
cout<<" "<<dic[subList[checkLen][i]];
}
else if(match(dic[subList[checkLen][i]] ,check))
cout<<" "<<dic[subList[checkLen][i]];
}
}
cout<<endl;
getline(cin, check);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: