字符串 自己看看留个纪念而已

题目poj1226(可暴力,可后缀数组)

 

 

//题意:给定n个串,求一个最大子串长度,
//使得它或者它的逆向串在每个串中出现。
 
//思路:先求出最短的串sho[],然后枚举答案长度ans(len~1)。
//于是sho[]就被分成了len-ans+1个子串pos[],
//再分别求出这些字串的反串inv[],
//判断pos[]和inv[]是否都出现在所有的串中。



#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
struct tt
{
    char s[110];
    int len;
}aa[110];

struct ttt
{
    char a[110],b[110];
    int len;
}bb[10000];
int cmp(ttt x,ttt y)
{
    return x.len>y.len;
};

int main () {
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int minn=210000,minid=0;
        for(int i=0;i<n;i++) {
            scanf("%s",aa[i].s);
            aa[i].len=strlen(aa[i].s);
            if(aa[i].len<minn)
                minn=aa[i].len,minid=i;
        }
        int id=0;
        for(int i=0;i<minn;i++) {
            for(int j=i;j<minn;j++)    {
                int kk=0;
                for(int k=i;k<=j;k++) 
                bb[id].a[kk++]=aa[minid].s[k];
                bb[id].a[kk]='\0';
                kk=0;
                for(int k=j;k>=i;k--)
                    bb[id].b[kk++]=aa[minid].s[k];
                bb[id].b[kk]='\0';
                bb[id].len=kk;
                id++;
            }
        }
        sort(bb,bb+id,cmp);
        int exist,ans=0;
        for(int ii=0;ii<id;ii++)
        {
            exist=1;
            for(int i=0;i<n;i++)
            {
                if(strstr(aa[i].s,bb[ii].a)==0&&strstr(aa[i].s,bb[ii].b)==0)
                {
                    exist=0;
                    break;
                }
            }
            if(exist){ans=bb[ii].len;break;}
        }
        printf("%d\n",ans);
    }

    return 0 ;
}        
View Code

 

posted @ 2014-09-01 14:57  laiba2004  Views(102)  Comments(0Edit  收藏  举报