還是回文串問題,字串是啥,大家應該都知道,就是滿足 s[i] = s[l - i + 1] (1 <= i <= l)的串,現在遇到了乙個問題,就是想問你乙個字串最少在後邊加幾個字元可以形成乙個回文串,並最後輸出形成的回文串
輸入包括多組資料,每組資料報含乙個字串
輸出轉換後的回文字串
add cigartragic dxhisgirl acaba abczyxyz
adda cigartragic dxhisgirlrigsihxd acabaca abczyxyzcba
題解:manacher,隨著陣列往前走,更新m和r,l沒什麼用,其實就是2*m-r,所以只需要管m和r就好了,由於多了"#"所以此時的值就是回文長度;只需要計算結尾處的最長回文就好了,以前做過類似題。。。
**:
#include#include#include#include#include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define si(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define pi(x) printf("%d",x)
#define pl(x) printf("%lld",x)
#define p_ printf(" ")
#define t_t while(t--)
#define f(i,s,x) for(i=s;ii)p[i]=min(p[2*mid-i],r-i);
// else//仔細想了想,這段不要就可以,只不過可能耗時了一些;但是本校oj資料弱,就ac了。。。
p[i]=1;
while(s[i+p[i]]==s[i-p[i]])p[i]++;
if(p[i]+i>r)r=p[i]+i,mid=i;
if(r==len)ans=max(ans,p[i]);
} return ans-1;
}int main()
s[len*2+1]='#';s[len*2+2]='\0';
int ans=manacher();
// printf("%d\n",ans);
printf("%s",a);
for(i=len-ans-1;i>=0;i--)printf("%c",a[i]);puts("");
} return 0;
}
kmp一遍a;
**:
#include#include#include#include#include#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define si(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define pi(x) printf("%d",x)
#define pl(x) printf("%lld",x)
#define p_ printf(" ")
#define t_t while(t--)
#define f(i,s,x) for(i=s;i=0;i--)printf("%c",a[i]);puts("");
} return 0;
}
hpuoj回文串問題 manacher kmp
還是回文串問題,字串是啥,大家應該都知道,就是滿足 s i s l i 1 1 i l 的串,現在遇到了乙個問題,就是想問你乙個字串最少在後邊加幾個字元可以形成乙個回文串,並最後輸出形成的回文串 輸入包括多組資料,每組資料報含乙個字串 輸出轉換後的回文字串 add cigartragic dxhis...
hpuoj 語文問題
時間限制 1 sec 記憶體限制 128 mb 提交 27 解決 8 提交 狀態 討論版 轉眼間一學期就將要過去了,楊八方也在大學裡經歷了許多事情,最難忘的自然是學校裡的各色課程。楊八方很喜歡中國的古典文化,所以當她知道大學有語文課的時候是很開心的。更幸運的是,楊八方的語文老師是位酷酷的男性。第一次...
回文串問題
乙個字串,如果從左到右讀和從右到左讀是完全一樣的,比如 aba 我們稱其為回文串。現在給你乙個字串,可在任意位置新增字元,求最少新增幾個字元,才能使其變成乙個回文串。輸入格式 任意給定的乙個字串,其長度不超過1000.輸出格式 能變成回文串所需新增的最少字元數。輸入樣例 在這裡給出一組輸入。例如 a...