【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】
生活随笔
收集整理的這篇文章主要介紹了
【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄地址
前言
其實可以不用哈希的,好像會更慢。還有之前看錯題了,所以會有些奇怪的地方
正題
給出一個字符串,求最長的至少出現過兩次的子串
輸入輸出(需要自取)
Input
輸入文件ygas.in第一行包含該字符串。數據保證該字符串非空,由小寫字母組成,且其長度不超過100。
Output
輸出文件ygas.out包含一個數代表至少出現兩次的最長子串的長度。
Sample Input
【輸入樣例1】
abcd
【輸入樣例2】
ababa
【輸入樣例3】
zzz
Sample Output
【輸出樣例1】
0
【輸出樣例2】
3
【輸出樣例3】
3
解題思路
請無視哈希。還有我手動打了一個find查找該字符串出現過的次數(因為前面看錯題了,又懶得改)。
代碼
#include<cstdio> #include<string> #include<iostream> #include<algorithm> using namespace std; const int p=29989; string s,hash[p+1],fs; int n,sum; int hashmath(string x) {int ans=0;for (int i=0;i<x.size();i++){ans=(ans*27+x[i]-96)%p;}return ans%p; } int locate(string x) {int wz=hashmath(x);int i=0;while (i<p && hash[(wz+i)%p]!=x && hash[(wz+i)%p]!="")i++;return (wz+i)%p; } int headfind(string fs)//手動查找 {int l=fs.size(),S=0;bool flag;for (int i=0;i<n;i++){if (s[i]==fs[0])//對頭{flag=true;for (int j=1;j<l;j++)if (s[i+j]!=fs[j])//往后搜{flag=false;break;}if (flag) S++;}}return S; } int main() {//freopen("ygas.in","r",stdin);//freopen("ygas.out","w",stdout);cin>>s;n=s.size();for (int i=0;i<n;i++){fs="";for (int j=i;j<n;j++){fs+=s[j];int wz=locate(fs);if (hash[wz]==""){hash[wz]=fs;if (headfind(fs)>=2)//出現次數超過2次{int l=fs.size();sum=max(sum,l);//更新最優解}}}}if (sum!=0) printf("%d",sum);else printf("0");return 0; }總結
以上是生活随笔為你收集整理的【2018.3.10】模拟赛之二-ssl2575 给出字符串【字符串】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 桃花源记恐怖真相 你真的知道吗?
- 下一篇: 【2018.3.10】模拟赛之三-ssl