| ||||||||||
| 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 | |||||||||
以及怎么用字典树比暴力还慢In Reply To:终于过了,WA了一次,注意重复的只输出一次!附代妈 Posted by:KatrineYang at 2016-06-10 15:55:48 > //============================================================================
> // Name : main1035.cpp
> // Author :
> // Version :
> // Copyright : Your copyright notice
> // Description : Hello World in C++, Ansi-style
> //============================================================================
>
> #include <iostream>
> #include <string>
> #include <vector>
> using namespace std;
>
> int cnt = 1;
> string dict[10001];
>
> int partion(vector<int>& array, int p, int r) {
> int x = array[r];
> int i = p - 1;//注意这点,把i设成负值,然后作为移动的标志
> int j;
> for (j = p; j < r; j++) {
> if (array[j] < x) {
> i++;
> int temp = array[j];
> array[j] = array[i];
> array[i] = temp;
> }
> }
> int temp = array[j];
> array[j] = array[i + 1];
> array[i + 1] = temp;
> return i+1;//返回的应该是交换后的哨兵的位置
> }
> //递归解决每个划分后的小
> void quickSort(vector<int>& array, int p, int r) {
> if (p < r) {
> int q = partion(array, p, r);
> quickSort(array, p, q - 1);
> quickSort(array, q + 1, r);
> }
> }
>
> class node{
> public:
> node* sub[27];
> int num;
> node(){
> num = 0;
> //cnt++;
> for(int i = 0; i < 27; i++) sub[i] = NULL;
> }
> };
> node* root;
> void buildTree(){
> root = new node();
> string s;
> while(getline(cin, s)){
> if(s == "#") return;
> dict[cnt] = s;
> node *iter = root;
> int len = s.length();
> for(int i = 0; i < len; i++){
> node *next = iter->sub[s[i] - 'a'];
> if(next == NULL){
> node *temp = new node();
> iter->sub[s[i] - 'a'] = temp;
> iter = iter->sub[s[i] - 'a'];
> }
> else{
> iter = next;
> }
> //if(s == "award")
> }
> node *newN = new node();
> iter->sub[26] = newN;
> iter = iter->sub[26];
> iter->num = cnt;
> cnt++;
> }
> }
>
> int have(node* start, string suffix){
> node *iter = start;
> int len = suffix.length();
>
> //int prc = len;
> for(int i = 0; i < len; i++){
> //cout << (int)(suffix[i]-'a') << endl;
> if(iter->sub[suffix[i]-'a'] == NULL){
> return 0;
> }
> //cout << 233 << endl;
> iter = iter->sub[suffix[i] - 'a'];
> }
>
> if(iter->sub[26] == NULL) return 0;
> return iter->sub[26]->num;
> }
>
> int main() {
>
> string ss = "test";
> //cout << "q" + ss.substr(4);
> buildTree();
> //cout << root << endl;
> string s;
> while(getline(cin, s)){
> if(s == "#") return 0;
> if(have(root, s) > 0){
> //cout << have(root, s) << endl;
> cout << s << " is correct\n";
> continue;
> }
> vector<int> res;
> int len = s.length();
> //int cnt = 0;
> //下面开始考虑增加一个
> node *iter = root;
> for(int i = 0; i <= len; i++){
> string sfx = s.substr(i);
> //cout << iter << endl;
> for(char c = 'a'; c <= 'z'; c++){
> //cout << c + sfx << endl;
> //cout << iter << endl;
> int result = have(iter, c + sfx);
> //cout << i << " " << c << endl;
> if(result > 0) res.push_back(result);
> //cout << result << endl;
>
> }
> if(i != len) iter = iter->sub[s[i] - 'a'];
> if(iter == NULL) break;
> }
> //cout << 1 << endl;
> //替换一个
> iter = root;
> for(int i = 0; i < len; i++){
> string sfx = s.substr(i+1);
> for(char c = 'a'; c <= 'z'; c++){
> int result = have(iter, c + sfx);
> if(result > 0) res.push_back(result);
> }
> iter = iter->sub[s[i] - 'a'];
> if(iter == NULL) break;
> }
> //删掉一个
> if(len > 1){
> iter = root;
> for(int i = 0; i < len; i++){
> string sfx = s.substr(i+1);
> int result = have(iter, sfx);
> if(result > 0) res.push_back(result);
> iter = iter->sub[s[i] - 'a'];
> if(iter == NULL) break;
> }
>
> }
>
> if(res.empty()){
> cout << s << ":" << endl;
> continue;
> }
> int sz = res.size();
> quickSort(res, 0, sz-1);
> cout << s << ":";
> int idx = 0;
> for(int i = 0; i < sz; i++) {
> if(res[i] == idx) continue;//这个不能少,否则重复输出!!!
> idx = res[i];
> cout << " " << dict[res[i]];
> }
> cout << endl;
>
> }
> //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator