题解 P5876 【化简单词】
进入正题前,先重磅推荐乱码团队以及我的博客。
当然,还要提醒大家,不能抄代码,请详细阅读洛谷社区规则!
本蒟蒻衷心希望管理员给个通过^_^
那么,闲言少叙,现在切入正题吧(我想我的方法不太复杂)!
这道题要用到一个ABOUT字符串的函数:
SUBSTR
这是什么?我们来举个例子:
假设s是一个字符串,s="YOUAREABIGPIG.",我想提取它从下表为0到下表为2的这一段,令他为t。
那么怎样做呢?这就要用到substr了。
表示方法为:t=s.substr(0,3);
如果用广泛的角度来讲,就是:
子串=原串.substr(起始位置,提取的子串的长度);
对于各位巨(蒟)佬(蒻)来说,一定很容易理解吧!
然后,我们对每一个串暴力枚举长度,如果当前长度不可行,就判断再长一点的长度。
怎样判断可不可行呢?挨个枚举其它字符串,看看前缀会不会重复,问题迎刃而解了!
其它注释见代码,那么现在,上代码!
#include<bits/stdc++.h>
using namespace std;
string s[51];
int len[51];
int main()
{
int n;
cin>>n;
int i,j,k;
for(i=1;i<=n;i++)
{
cin>>s[i];
len[i]=s[i].size();
}
//前面是输入,自然不必多说,如果无法理解,请回吧^_^
for(i=1;i<=n;i++)
{
for(j=1;j<=len[i];j++)
{
bool flag=true;
for(k=1;k<=n;k++)
{
if(i==k)
{
continue;
}
//如果是同一个串,自然不必判。
if(s[i].substr(0,j)==s[k].substr(0,j))
{
flag=false;
}
//判断前缀是否相同,相同的话,这个长度就不成立了。
}
if(flag)
{
cout<<s[i].substr(0,j)<<endl;
break;
}
}
}
return 0;
}