A. You're Given a String...
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You're given a string of lower-case Latin letters. Your task is to find the length of its longest substring that can be met in the string at least twice. These occurrences can overlap (see sample test 2).

Input

The first input line contains the string. It's guaranteed, that the string is non-empty, consists of lower-case Latin letters, and its length doesn't exceed 100.

Output

Output one number — length of the longest substring that can be met in the string at least twice.

Examples
input
abcd
output
0
input
ababa
output
3
input
zzz
output
2
其实就是一个字符串的问题,水题一道,但我想跟大家说说不同的做法:
 #include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for((i)=0;(i)<(int)(n);i++)
int main(){
int n,i,j,k;
string s;
cin>>s;
n=s.length();
int ans=;
REP(i,n) REP(j,n) if(i<j){//两个字符串首元素位置
for(k=;;k++) if(i+k>=n||j+k>=n||s[i+k]!=s[j+k]) break;//跑字符串长度,越界或不匹配跳出
ans=max(ans,k);//更新最大值
}
cout<<ans<<endl;
return ;
}
这是最普通的做法了,O(n^3),其实不到。
这个方法好在第三重循环,写的很妙。
 for(k=;;k++) if(i+k>=n||j+k>=n||s[i+k]!=s[j+k]) break;
跑两个字符串的首元素的位置,而不是先跑长度,这个想法很有趣。
之后再跑长度后就可以一位一位跑了,
这样比一个个枚举同样长度的字符串要好很多。
对比一下先跑长度的做法:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int res=;
for(int l=;l<=s.size();l++){//跑长度
vector<string>v;
for(int i=;i+l-<s.size();i++)
v.push_back(s.substr(i,l));//把当前长度的字符串扔进vector里
sort(v.begin(),v.end());//排序准备匹配
for(int i=;i<v.size()-;i++)//开始匹配
if(v[i]==v[i+]){//匹配成功,保存长度
res=l;
break;
}
}
cout<<res<<endl;
return ;
}
是不是匹配时麻烦很多?
当然,这里通过排序匹配,其实也可以用STL里的Set来做:
#include<bits/stdc++.h>
using namespace std;
int n,m;
string w;
set<string>all;
int main(){
cin>>w;
int n=w.size();
for(int i=n-;i>;i--){//跑长度
all.clear();//清空set
for(int j=;j+i<=n;j++) all.insert(w.substr(j,i));//将子串插入集合
if(all.size()!=n-i+){//集合里元素个数与总个数不一样,说明有重复,成功!
cout<<i<<endl;
return ;
}
}
cout<<<<endl;
return ;
}
是不是也很妙?
总结:本题是水题,但我把水题做出3种解法出来,说明这题质量很好
希望大家在一些优秀的题上不妨多想想,这样信息学水平会提高不少的。
(打比赛时就被这么无聊了,毕竟比赛比谁做的对,不是谁写的更好!)
 


最新文章

  1. SAP 出库单新版
  2. 《Qt Quick 4小时入门》学习笔记4
  3. Atitit 软件项目非法模块与功能的管理与 &#160;监狱管理的对比 原理与概论attilax总结
  4. RabbitMQ学习笔记5-简单的RPC调用
  5. IE样式兼容写法
  6. c语言随机数
  7. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客
  8. 《Java程序设计》终极不改版【下】
  9. IP地址段遍历
  10. [笔记]JS flat and flatMap
  11. AWK编程
  12. Architectural principles
  13. Centos7.0进入单用户模式修改root密码
  14. 计算机网络 0.初识Internet与TCP/IP协议
  15. mybatis @SelectKey加于不加的区别
  16. 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
  17. RabbitMQ学习笔记(一):安装及Springboot集成
  18. implode,explode的使用
  19. 处理函数和数组声明[条款17]---《C++必知必会》
  20. ocp题库更新,052最新考试题及答案整理-31

热门文章

  1. .NET Core 发布部署问题
  2. 【原创】大叔经验分享(88)jenkins假死
  3. 定义Java类实现字节流转字符流
  4. Maven 三种archetype说明--转载
  5. Linux命令——w、who、whoami、lastlog、last
  6. 5.Hbase API 操作开发
  7. Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法
  8. 《图解HTTP》笔记1
  9. BZOJ 3218 A + B Problem (可持久化线段树+最小割)
  10. mongod破解版的安装