题解 洛谷P5876 【化简单词】
那么,闲言少叙,现在切入正题吧(我想我的方法不太复杂)!
这道题要用到一个ABOUT字符串的函数:
SUBSTR
这是什么?我们来举个例子:
假设s是一个字符串,s="YOUAREABIGPIG.",我想提取它从下表为0到下表为2的这一段,令他为t。
那么怎样做呢?这就要用到substr了。
表示方法为:t=s.substr(0,3);
如果用广泛的角度来讲,就是:
子串=原串.substr(起始位置,提取的子串的长度);
对于各位巨(蒟)佬(蒻)来说,一定很容易理解吧!
然后,我们对每一个串暴力枚举长度,如果当前长度不可行,就判断再长一点的长度。
怎样判断可不可行呢?挨个枚举其它字符串,看看前缀会不会重复,问题迎刃而解了!
其它注释见代码,那么现在,上代码!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
点个赞再走吧!
不要妄图追上西坠的太阳,而是要在黎明前就等着它!