POJ 1509 Glass Beads

POJ 1509 Glass Beads

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

后缀自己主动机的简单运用….

Glass Beads
Time Limit: 3000MS   Memory Limit: 10000K
Total Submissions: 2352   Accepted: 1375

Description

Once upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies most of all. All the people loved her. But she was not interested in the crowds. Her big hobby were beads of any kind. Many bead makers were working for her and they manufactured new necklaces and bracelets every day. One day she called her main Inspector of Bead Makers (IBM) and told him she wanted a very long and special necklace. 

The necklace should be made of glass beads of different sizes connected to each other but without any thread running through the beads, so that means the beads can be disconnected at any point. The actress chose the succession of beads she wants to have and the IBM promised to make the necklace. But then he realized a problem. The joint between two neighbouring beads is not very robust so it is possible that the necklace will get torn by its own weight. The situation becomes even worse when the necklace is disjoined. Moreover, the point of disconnection is very important. If there are small beads at the beginning, the possibility of tearing is much higher than if there were large beads. IBM wants to test the robustness of a necklace so he needs a program that will be able to determine the worst possible point of disjoining the beads. 

The description of the necklace is a string A = a1a2 … am specifying sizes of the particular beads, where the last character am is considered to precede character a1 in circular fashion. 

The disjoint point i is said to be worse than the disjoint point j if and only if the string aiai+1 … ana1 … ai-1 is lexicografically smaller than the string ajaj+1 … ana1 … aj-1. String a1a2 … an is lexicografically smaller than the string b1b2 … bn if and only if there exists an integer i, i <= n, so that aj=bj, for each j, 1 <= j < i and ai < bi

Input

The input consists of N cases. The first line of the input contains only positive integer N. Then follow the cases. Each case consists of exactly one line containing necklace description. Maximal length of each description is 10000 characters. Each bead is represented by a lower-case character of the english alphabet (a–z), where a < b … z.

Output

For each case, print exactly one line containing only one integer — number of the bead which is the first at the worst possible disjoining, i.e.\ such i, that the string A[i] is lexicographically smallest among all the n possible disjoinings of a necklace. If there are more than one solution, print the one with the lowest i.

Sample Input

4
helloworld
amandamanda
dontcallmebfu
aaabaaa

Sample Output

10
11
6
5

Source

[Submit]   [Go Back]   [Status]   [Discuss]

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int CHAR=26,maxn=50000;

struct SAM_Node
{
    SAM_Node *fa,*next[CHAR];
    int len,id,pos;
    SAM_Node(){}
    SAM_Node(int _len)
    {
        fa=0; len=_len;
        memset(next,0,sizeof(next));
    }
};

SAM_Node SAM_node[maxn],*SAM_root,*SAM_last;
int SAM_size;

SAM_Node *newSAM_Node(int len)
{
    SAM_node[SAM_size]=SAM_Node(len);
    SAM_node[SAM_size].id=SAM_size;
    return &SAM_node[SAM_size++];
}

SAM_Node *newSAM_Node(SAM_Node *p)
{
    SAM_node[SAM_size]=*p;
    SAM_node[SAM_size].id=SAM_size;
    return &SAM_node[SAM_size++];
}

void SAM_init()
{
    SAM_size=0;
    SAM_root=SAM_last=newSAM_Node(0);
    SAM_node[0].pos=0;
}

void SAM_add(int x,int len)
{
    SAM_Node *p=SAM_last,*np=newSAM_Node(p->len+1);
    np->pos=len; SAM_last=np;
    for(;p&&!p->next[x];p=p->fa) p->next[x]=np;
    if(!p)
    {
        np->fa=SAM_root; return ;
    }
    SAM_Node *q=p->next[x];
    if(p->len+1==q->len)
    {
        np->fa=q; return;
    }
    SAM_Node *nq=newSAM_Node(q);
    nq->len=p->len+1;
    q->fa=nq; np->fa=nq;
    for(;p&&p->next[x]==q;p=p->fa)
        p->next[x]=nq;
}

void SAM_build(char * s)
{
    SAM_init();
    int len=strlen(s);
    for(int i=0;i<len;i++)
        SAM_add(s[i]-'a',i+1);
}

char str[maxn];
int the_last=-1;

void dfs(SAM_Node* head,int n)
{
    if(n==0)
    {
        the_last=head->pos;
        return ;
    }
    for(int i=0;i<26;i++)
    {
        if(head->next[i])
        {
            dfs(head->next[i],n-1);
            return ;
        }
    }
}

int main()
{
    int T_T;
    scanf("%d",&T_T);
    while(T_T--)
    {
        scanf("%s",str);
        int n=strlen(str);
        for(int i=0;i<n;i++)
            str[i+n]=str[i];
        str[2*n]=0;
        SAM_build(str);
        SAM_Node *temp=SAM_root;
        n=strlen(str);
        dfs(temp,n/2);
        printf("%d\n",the_last+1-n/2);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118888.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux安装mysql5.7.26 –(傻瓜版3分钟搞定)

    Linux安装mysql5.7.26 –(傻瓜版3分钟搞定)前言在这之前的一天时间里,我全网搜mysql的各种安装方式,还有版本不同带来的问题,会发现在Mac或者在linux上安装5.7一下版本时,出现的问题会少很多,尤其是拿着dmg文件在Mac安装就是1分钟的事,但是在linux安装5.7时出现了不少的问题,出现的问题各式各样,大家安装时碰到问题了,一定要找你当前版本下的解决方式。严格按照本文步骤可以顺利安装,这也是我连续在三…

    2022年6月5日
    36
  • 股票实时数据接口api_股票开放接口api

    股票实时数据接口api_股票开放接口api免费股票数据API接口提供沪深、香港、美国股市信息。1.沪深股市2.香港股市3.美国股市4.香港股市列表5.美国股市列表6.深圳股市列表7.沪股列表API文档:https://www.juhe.cn/docs/api/id/21,申请获取APPKEY即可调用。示例代码PHP股票数据示例Python股票数据接口调用示例C#股票…

    2025年11月28日
    7
  • 请你用三角形和平行四边形设计一个漂亮的图案(圆形和正方形组合图形)

    一共收集整理了图形20个,比较实用,同时也为了熟悉CSS的代码。整合了一下,有错误欢迎指出。1.正方形650)this.width=650;”alt=””border=”0″src=”http://www.meilizhuo.com/uploads/allimg/141105/09101KE1-0.png”style=”border:0px;”/>#square{width:100

    2022年4月10日
    356
  • clion永久激活码2021-激活码分享「建议收藏」

    (clion永久激活码2021)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    2.9K
  • linux查看当前目录下的全路径

    使用pwd命令可查看当前目录下的全路径。当然,也可以使用manpwd查看帮助。

    2022年4月13日
    242
  • pycharm代码自动提示_pycharm自动整理代码

    pycharm代码自动提示_pycharm自动整理代码那什么,,,,,,是这样的,请先确保你的代码补全功能是打开的。打开操作方式是:file—->powersavemode,把这个前面的√号去掉即可。然后,代码在提示的时候,多打几个字,发现你想要的已经在最上面的时候按tab键即可补全

    2022年8月25日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号