題目來源
DBSDFZOJ Password
http://218.62.22.209:8080/problem.php?cid=1408&pid=0
題目描述
你來到了一個廟前,廟牌上有一個僅包含小寫字母的字符串 s。
傳說打開廟門的密碼是這個字符串的一個子串t,並且t既是s的前綴又是s的後綴並且還在s的中間位置出現過。
如果存在這樣的串,請你輸出這個串,如有多個滿足條件的串,輸出最長的那一個。
如果不存在這樣的串,輸出"Just a legend"(去掉引號)。
輸入格式
僅一行,字符串 s。
輸出格式
如題所述
樣例輸入
fixprefixsuffix
樣例輸出
fix
數據範圍
對於60%的數據,s的長度<=100
對於100%的數據,s的長度<=100000
思路
當然是用我萬能的string系統函數啦
處理兩個字符串(原字符串爲s)
see——s去掉開頭和結尾的各一個字符
re——s倒序
i=s.size()~1循環驗證是否有長度爲i的子串符合要求
如果有 輸出該子串並結束程序
在循環中暴力比較s的長度爲i的前綴是否也是s的後綴
如果是 取字符串mos爲s的長度爲i的前綴
在see中尋找mos是否出現過
如果出現過 則mos即爲所求字符串
代碼(C++)
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int len,k; bool w;
string s,re,ans,mos,see;
int main()
{
cin>>s; //懶得寫讀入優化了就cin吧
len=s.size();
see=s; see.erase(len-1); see.erase(0,1);
for(int i=0;i<len;i++)
re.append(1,s[len-i-1]);
for(int i=len-3;i>=0;i--)
{
w=1; k=i;
for(int j=0;j<=i&&w==1;j++,k--)
if(s[k]!=re[j])
w=0;
if(w==1)
{
mos.assign(s,0,i+1);
if(see.find(mos,0)!=string::npos)
{
cout<<mos;
return 0;
}
}
}
cout<<"Just a legend";
return 0;
}