这题刚开始自己撸了一发代码及其繁琐的代码,虽然AC了,但是感觉太烂了,
百度了一下,发下自己截取单词的部分写残了,写复杂了,
另外起初WA了一发,是因为不知道string自带的排序是不稳定排序。
另外这题最简单的做法是用set加上multimap,multimap自动在插入的时候进行排序,
而且是稳定排序,另外set自带的查找函数也省去了写查找了。
自己的代码:注释部分是自己截取字符串的繁琐的代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<sstream>
#include<string>
using namespace std;
struct ss
{
string key;
char s[300];
int ai;
}result[10010];
int cmp(ss a,ss b)
{
if(a.key!=b.key)
return a.key<b.key;
else
return a.ai<b.ai;
}
int main()
{
char word[60][15];
char ss[300];
int wlen=0;
while(gets(word[wlen])&&strcmp(word[wlen],"::")) {wlen++;}
int rlen=0;
while(gets(ss))
{
for(int i=0;i<strlen(ss);i++)
{
if(isalpha(ss[i]))
ss[i]=tolower(ss[i]);
}
// cout<<ss<<endl;
for(int j=0;j<strlen(ss);j++)
{
char temp[20];
/* if(isalpha(ss[j]))
{
temp[len]=ss[j];
len++;
}
// cout<<temp<<endl;
if((ss[j]==' '||ss[j]=='\0')&&len)
{
temp[len]='\0';
// cout<<temp<<endl;
int k;
for(k=0;k<wlen;k++)
{
if(strcmp(temp,word[k])==0)
break;
}
if(k==wlen)
{
result[rlen].key=result[rlen].key+temp;
strcpy(result[rlen].s,ss);
// cout<<result[rlen].s<<endl;;
for(int t=front;t<j;t++)
{
if(isalpha(result[rlen].s[t]))
result[rlen].s[t]=toupper(result[rlen].s[t]);
}
result[rlen].ai=rlen;
rlen++;
}
front=j;
len=0;
}
*/
if(!isalpha(ss[j])) continue;
int tt=j;
// char temp[20];
int len=0;
while(isalpha(ss[tt]))
{
temp[len]=ss[tt];
len++;
tt++;
}
temp[len]='\0';
int k;
for(k=0;k<wlen;k++)
{
if(strcmp(temp,word[k])==0)
break;
}
if(k==wlen)
{
result[rlen].key=result[rlen].key+temp;
strcpy(result[rlen].s,ss);
// cout<<result[rlen].s<<endl;;
for(int t=j;t<tt;t++)
{
//if(isalpha(result[rlen].s[t]))
result[rlen].s[t]=toupper(result[rlen].s[t]);
}
result[rlen].ai=rlen;
rlen++;
}
j=tt;
}
}
sort(result,result+rlen,cmp);
// for(int i=0;i<rlen;i++)
// cout<<result[i].s<<endl;
// cout<<rlen<<endl;
for(int i=0;i<rlen;i++)
cout<<result[i].s<<endl;
return 0;
}
容器代码:
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<map>
#include<set>
#include<cmath>
#include<cstring>
#include<cctype>
#include<climits>
#include<memory>
using namespace std;
#define LL long long
#define INT (1<<31)-1;
const int N=5000;
int main()
{
set<string> ignore;
multimap<string,string> r;
string t;
while(getline(cin,t)&&t!="::") ignore.insert(t);
while(getline(cin,t))
{
for(int i=0;i<t.length();i++)
t[i]=tolower(t[i]);
for(int i=0;i<t.size();i++)
{
if(!isalpha(t[i]))
continue;
string t2;
int j=i;
while(isalpha(t[j]))
{
t2+=t[j];
j++;
}
if(!ignore.count(t2))
{
for(int k=0;k<t2.size();k++)
t2[k]=toupper(t2[k]);
string t3=t;
t3.replace(i,t2.size(),t2);
r.insert(make_pair(t2,t3));
}
i=j;
}
}
for(map<string ,string> ::iterator i=r.begin();i!=r.end();i++)
cout<<i->second<<endl;
return 0;
}