據說如果你給無限只母牛和無限臺巨型可攜式電腦(有非常大的鍵盤),那麼母牛們會製造出世上最棒的回文。你的工作就是去尋找這些牛製造的奇觀(最棒的回文)。
在尋找回文時不用理睬那些標點符號、空格(但應該保留下來以便做為答案輸出),只用考慮字母』a』-『z』和』a』-『z』。要你尋找的最長的回文的文章是乙個不超過20,000個字元的字串。我們將保證最長的回文不會超過2,000個字元(在除去標點符號、空格之前)。
輸入格式:
輸入檔案不會超過20,000字元。這個檔案可能一行或多行,但是每行都不超過80個字元(不包括最後的換行符)。
輸出的第一行應該包括找到的最長的回文的長度。
下一行或幾行應該包括這個回文的原文(沒有除去標點符號、空格),把這個回文輸出到一行或多行(如果回文中包括換行符)。
如果有多個回文長度都等於最大值,輸出最前面出現的那乙個。
confucius say: madam, i』m adam.
11\
madam, i』m adam
題目翻譯來自nocow。
usaco training section 1.3
對於這個長串 跑一邊manacher 就行了
但是輸入的時候稍加改動 比如說用getchar讀入
因為會有空行
然後存入的時候記錄以下原本位置
輸出就輸出原本位置之間的東西就行了
#include
#include
#include
#include
#include
#include
using namespace std;
char s[50005];
char fr[50005];
int len[50005],plc[50005];
int maxright=-1,pos=0;
int cnt=0;
void add(char ch,int
pos)
void manacher()
//printf("maxright=%d\n",maxright);
}}char c;
int n;
int main()
manacher();
int mx=0;
int l=0,r=0;
for(int i=1;i<=cnt;i++)
mx=max(mx,len[i]);
printf("%d\n",mx-1);
//for(int i=1;i<=cnt;i++)
// printf("%d " ,len[i]);
//printf("\n");
for(int i=1;i<=cnt;i++)
if(len[i]==mx)
// printf("l=%d,r=%d\n",l,r);
//for(int i=1;i<=cnt;i++)
//printf("%d ",plc[i]);
//printf("\n");
for(int i=l;i<=r;i++)
printf("%c",fr[i]);
return
0;}
P1210 回文檢測 manacher演算法
p1210 回文檢測 manacher演算法 str2 i str2 i a a str2只取小寫字母,因為,回文大小寫都算,但字元判斷確不是這樣,所以這樣處理 len init str2 init是要返回新陣列長度的。for i 1 ii len i min maxn i,len 2 po i e...
luogu1210 回文檢測
據說如果你給無限只母牛和無限臺巨型可攜式電腦 有非常大的鍵盤 那麼母牛們會製造出世上最棒的回文。你的工作就是去尋找這些牛製造的奇觀 最棒的回文 在尋找回文時不用理睬那些標點符號 空格 但應該保留下來以便做為答案輸出 只用考慮字母 a z 和 a z 要你尋找的最長的回文的文章是乙個不超過20,000...
洛谷P1015回文數
若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個十進位制數56,將56加65 即把5656從右向左讀 得到121是乙個回文數。又如 對於十進位制數8787 step1 87 78 165 step2 165 561 726 step3 726 627 135...