ural 1297 Palindrome(Manacher模板题)

转载请注明出处: http://www.cnblogs.com/fraud/           ——by fraud

 

求最长回文子串。

http://acm.timus.ru/problem.aspx?space=1&num=1297

Manacher模板题,复杂度O(n),做这题纯属是为了验一下自己写的模板是否正确。

当然这题也可以用后缀数组来搞

 1 #include <iostream>

 2 #include <sstream>

 3 #include <ios>

 4 #include <iomanip>

 5 #include <functional>

 6 #include <algorithm>

 7 #include <vector>

 8 #include <string>

 9 #include <list>

10 #include <queue>

11 #include <deque>

12 #include <stack>

13 #include <set>

14 #include <map>

15 #include <cstdio>

16 #include <cstdlib>

17 #include <cmath>

18 #include <cstring>

19 #include <climits>

20 #include <cctype>

21 using namespace std;

22 #define XINF INT_MAX

23 #define INF 0x3FFFFFFF

24 #define MP(X,Y) make_pair(X,Y)

25 #define PB(X) push_back(X)

26 #define REP(X,N) for(int X=0;X<N;X++)

27 #define REP2(X,L,R) for(int X=L;X<=R;X++)

28 #define DEP(X,R,L) for(int X=R;X>=L;X--)

29 #define CLR(A,X) memset(A,X,sizeof(A))

30 #define IT iterator

31 typedef long long ll;

32 typedef pair<int,int> PII;

33 typedef vector<PII> VII;

34 typedef vector<int> VI;

35 #define MAXN 100010

36 char str[MAXN],s[MAXN];

37 int p[MAXN];

38 int n;

39 void Manacher(){

40     n=strlen(s);

41     str[0]='$';

42     str[1]='#';

43     for(int i=0;i<n;i++)str[2*i+2]=s[i],str[2*i+3]='#';

44     n=n*2+2;

45     str[n]=0;

46     int mx=0,id;

47     for(int i=1;i<n;i++){

48         if(mx>i)p[i]=min(p[2*id-i],mx-i);

49         else p[i]=1;

50         for(;str[i+p[i]]==str[i-p[i]];p[i]++);

51         if(p[i]+i>mx)mx=p[i]+i,id=i;

52     }

53 }

54     

55 int main()

56 {

57     ios::sync_with_stdio(false);

58     while(scanf("%s",s)!=EOF){

59         Manacher();

60         int ans=1;

61         int id;

62         int maxx=1;

63         for(int i=0;i<n;i++){

64             if(p[i]>maxx)id=i,maxx=p[i];

65         }

66         //cout<<maxx<<endl;

67         p[id]--;

68         for(int i=id-p[id];i<=id+p[id];i++){

69             if(str[i]=='#')continue;

70             printf("%c",str[i]);

71         }

72         puts("");

73     }

74     return 0;

75 }

 

你可能感兴趣的:(ROM)