PDA

View Full Version : پیدا کردن قافیه



Azar.099
شنبه 26 اردیبهشت 1394, 17:34 عصر
سلام
من یک سری کلمه در اختیارم قرار میگیره (یعنی یک سری کلمه به عنوان منبع خواهم داشت ) و یک سری کلمه دیگر هم بهم داده میشه که باید تعداد کلماتی از منبعم را که این قافیه ها را دارند پیدا بکنم .
به بیان ساده تر وقتی میگه داخل کلمات منبع کلمه ها با قافیه x را پیدا کن من باید کلمه هایی مثل xy را پیدا بکنم که طول y بیش از 5 نباشه .
من از درخت ترای میخوام استفاده بکنم برای ذخیره کلمات منبع
حالا برای پیدا کردن قافیه ها دچار مشکل شدم و نمیدونم باید چجوری این قافیه ها را پیدا بکنم داخل درخت
چون سرچ داخل درخت هم از ریشه هست .
شما ایده ای ندارید ؟

این درخت ترای :
#include <iostream>#include <vector>
using namespace std;


class Node {
public:
Node() { mContent = ' '; mMarker = false; }
~Node() {}
char content() { return mContent; }
void setContent(char c) { mContent = c; }
bool wordMarker() { return mMarker; }
void setWordMarker() { mMarker = true; }
Node* findChild(char c);
void appendChild(Node* child) { mChildren.push_back(child); }
vector<Node*> children() { return mChildren; }


private:
char mContent;
bool mMarker;
vector<Node*> mChildren;
};


class Trie {
public:
Trie();
~Trie();
void addWord(string s);
bool searchWord(string s);
//void deleteWord(string s);
private:
Node* root;
};


Node* Node::findChild(char c)
{
for (int i = 0; i < mChildren.size(); i++)
{
Node* tmp = mChildren.at(i);
if (tmp->content() == c)
{
return tmp;
}
}


return NULL;
}


Trie::Trie()
{
root = new Node();
}


Trie::~Trie()
{
// Free memory
}


void Trie::addWord(string s)
{
Node* current = root;


if (s.length() == 0)
{
current->setWordMarker(); // an empty word
return;
}


for (int i = 0; i < s.length(); i++)
{
Node* child = current->findChild(s[i]);
if (child != NULL)
{
current = child;
}
else
{
Node* tmp = new Node();
tmp->setContent(s[i]);
current->appendChild(tmp);
current = tmp;
}
if (i == s.length() - 1)
current->setWordMarker();
}
}




bool Trie::searchWord(string s)
{
Node* current = root;


while (current != NULL)
{
for (int i = 0; i < s.length(); i++)
{
Node* tmp = current->findChild(s[i]);
if (tmp == NULL)
return false;
current = tmp;
}


if (current->wordMarker())
return true;
else
return false;
}


return false;
}

Azar.099
شنبه 26 اردیبهشت 1394, 23:04 عصر
این یه نمونش که بدون درخت نوشتم
#include <iostream>#include <vector>
#include <string>
using namespace std;


int main()
{
vector<string> source;
int m, n;
cin >> m;
cin >> n;
string name , rhyme;
bool flag = false;
int count = 0;
for (int i = 0; i < m; i++)
{
cin >> name;
source.push_back(name);
if (flag == true)
{
for (int j = 0; j < source.size()-1; j++)
{
if (source.at(j).compare(source.at(source.size() - 1)) == 0)
{
source.pop_back();
count++;
}
}
}
flag = true;
}
m = m - count;
int counter;
int p;
int k;
vector<int> NUM;
for (int i = 0; i < n; i++)
{
cin >> rhyme;
counter = 0;
for (int j = 0; j < m; j++)
{
p = source[j].length();
k = rhyme.size();
while (k != 0)
{
if (source[j].at(p-1)== rhyme.at(k-1))
{
k--;
p--;
}

else
break;
}
if (k == 0)
{
if ((p-k)<5 || (p-k)==5)
counter++;
}
}
NUM.push_back(counter);
}


for (int i = 0; i < NUM.size(); i++)
{
cout << NUM[i] << endl;
}
}

Azar.099
سه شنبه 29 اردیبهشت 1394, 23:11 عصر
این کد دومم بعضی از تست کیس هارو اشتباه میده
شما نمیدونید مشکلش چیه ؟

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at
Aborted (core dumped)