晕死的题,就因为一个判断后的break循环弄了我半小时,还是看了前人的讨论才AC的。。。

先判断长度一致的string,再判断是否所有字符相同(顺序不同)
#include <iostream>
#include 
<vector>
#include 
<string>
using namespace std;

bool compare(string s1,string s2)   //比较字符串
{
    
int len=(int)s1.length();
    
int* use=new int[len];
    memset(use,
0,len*sizeof(use));
    
for (size_t i=0;i<s1.length();i++)
    
{
        
for(size_t j=0;j<s2.length();j++)
        
{
            
if (s1[i]==s2[j]&&use[j]==0)
            
{
                use[j]
=1;
                
break;     //注意啊,找到一个后就break了
            }

        }

    }

    
for (int i=0;i<len;i++)
    
{
        
if (use[i]==0)
        
{
            delete [] use;
            
return false;
        }

    }

    delete [] use;
    
return true;
}


void stringorder(vector<string> s)   //输出字符串排序
{
    
int *a=new int[(int)s.size()];
    memset(a,
0,(int)s.size()*sizeof(a));
    
int n;
    
for (size_t j=0;j<s.size();j++)
    
{
        n
=0;
        
for (size_t i=0;i<s.size();i++)
        
{
            
if (a[n]!=0)
            
{
                n
++;
            }

            
if (s[i]<s[n]&&a[i]==0)    //取最小字符串
            {
                n
=(int)i;
            }

        }

        cout
<<s[n]<<endl;
        a[n]
=1;
    }

    delete [] a;
}

int main()
{
    vector
<string> words;
    vector
<string> unwords;
    
string s;bool word=true,end=false;
   
    
while (1)        //输入判断
    
        cin
>>s;
        
if (s=="XXXXXX"&&end==true)
       
{
            
break;
        }

        
if (s=="XXXXXX"&&end==false)
        
{
            word
=false;
            end
=true;
            
continue;
        }
        
        
if (word==true)
        
{
            words.push_back(s);
        }

        
if (word==false)
        
{
            unwords.push_back(s);
        }

    }

    
bool find;
    vector
<string> order;
    
for (size_t i=0;i<unwords.size();i++)
    
{
        find
=false;
        order.clear();
        
for (size_t j=0;j<words.size();j++)
        
{
            
//判断相同长度,再比较是否字母相同
            if (unwords[i].length()==words[j].length()&&compare(unwords[i],words[j])==true)
            
{
                order.push_back(words[j]);
                find
=true;
            }

        }

        
if (find==true)
        
{
            stringorder(order);
        }

        
if (find==false)
        
{
            cout
<<"NOT A VALID WORD"<<endl;
        }

        cout
<<"******"<<endl;
    }

}