2752 Seek the Name, Seek the Fame //KMP

本文介绍了一种用于寻找字符串中既是前缀也是后缀的子串算法,并提供了一个具体的实现示例。该算法适用于帮助解决一类特定的问题,例如为新生儿起名等有趣的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Seek the Name, Seek the Fame
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 5243 Accepted: 2308

Description

The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the fame. In order to escape from such boring job, the innovative little cat works out an easy but fantastic algorithm:

Step1. Connect the father's name and the mother's name, to a new string S.
Step2. Find a proper prefix-suffix string of S (which is not only the prefix, but also the suffix of S).

Example: Father='ala', Mother='la', we have S = 'ala'+'la' = 'alala'. Potential prefix-suffix strings of S are {'a', 'ala', 'alala'}. Given the string S, could you help the little cat to write a program to calculate the length of possible prefix-suffix strings of S? (He might thank you by giving your baby a name:)

Input

The input contains a number of test cases. Each test case occupies a single line that contains the string S described above.

Restrictions: Only lowercase letters may appear in the input. 1 <= Length of S <= 400000.

Output

For each test case, output a single line with integer numbers in increasing order, denoting the possible length of the new baby's name.

Sample Input

ababcababababcabab
aaaaa

Sample Output

2 4 9 18
1 2 3 4 5

Source

 

 

#include<stdio.h>
#include<string.h>
char s[400001];
int l;
int p[400001];
int a[400001];
void init()
{
    int j;
    p[1]=0;
    for(int i=2;i<=l;i++)
    {
        j=p[i-1];
        while(j>0&&s[j+1]!=s[i])  j=p[j];
        if(s[j+1]==s[i])  j++;
        p[i]=j;
    }
}
int main()
{
    while(scanf("%s",s+1)!=EOF)
    {
        s[0]='1';
        l=strlen(s)-1;
        init();
        int num=0;
        int j=l;
        while(j>0)
        {
            a[num++]=j;
            j=p[j];
        }
        for(int i=num-1;i>=0;i--)
        {
            if(i!=num-1) printf(" %d",a[i]);
            else  printf("%d",a[i]);
        }
        printf("/n");
    }
    return 0;
}

### Fame-Relay 使用方法 Fame-relay 是一种用于处理和转发消息的中间件工具,通常应用于微服务架构中。其主要功能是在不同的服务之间建立可靠的通信通道[^1]。 #### 安装 Fame-Relay 为了使用 Fame-Relay,首先需要安装该软件包: ```bash npm install fame-relay ``` #### 基本配置 创建一个简单的 Fame-Relay 配置文件 `config.js` 如下所示: ```javascript const config = { port: 8080, routes: [ { path: '/api/v1', target: 'http://backend-service' } ] }; module.exports = config; ``` 启动 Fame-Relay 实例可以通过命令行执行: ```bash node relayServer.js ``` 其中 `relayServer.js` 文件内容如下: ```javascript const createRelay = require('fame-relay'); require('./config'); createRelay(config).listen(config.port, () => { console.log(`Fame-Relay listening on ${config.port}`); }); ``` ### Fame-Relay 与 Map 的关联 Map 数据结构可以用来存储路由映射关系,在 Fame-Relay 中起到关键作用。通过 JavaScript 内建的对象或 ES6 提供的新特性——Map 来管理路径到目标地址之间的对应表[^2]。 例如,可以在上述例子中的 `routes` 数组替换为更灵活的 Map 结构来定义路由规则: ```javascript const routeMap = new Map([ ['/api/v1/users', 'http://user-service'], ['/api/v1/orders', 'http://order-service'] ]); // 将 Map 转换回数组形式以便兼容现有代码逻辑 const routesArray = Array.from(routeMap.entries()).map(([path, target]) => ({ path, target })); const configWithMap = { ...config, routes: routesArray }; ``` 这样不仅使配置更加直观易读,而且便于动态修改路由设置而无需重启整个应用服务器[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值