首页 > 代码库 > 字符串 自己看看留个纪念而已

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

题目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

 

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