6133 Cellphone Typing (trie)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4144

Sample Input
4
hello
hell
heaven
goodbye
3
hi
he
h
7
structure
structures
ride
riders
stress
solstice
ridiculous
Sample Output
2.00
1.67
2.71

题意:输入n表示接下来有n个字符串,我用的是一个智能输出软件,如我键入h,则e会自动弹出不需要人工输入,若再输入a则heaven已确定;若不输入a而是输入l 则此时显示的时hell(第二个l是自动弹出的);若一开始输入的是g则goodbye可直接弹出。求n字符串需要输入多少次可以全部输出;第一个case 中,hello3次、hell2次、heaven2次、goodbye 1次;共8次,最终输出其平均输入次数8/n;

`思路:

6133 Cellphone Typing (trie)_第1张图片

建trie图,图是样例1的trie图,数字代表同一个字母在相同前缀中出现的次数,当一个字母出现的次数大于下一个字母出现的次数时累加下一字母出现的次数,但每个字符串的第一个字母不遵从这个规律,因为无论怎样首字母都要累加,故可以最后处理(前面所求总和再加n即可),在累加过程中遇到次数为1时,遵从了上述的累加规律后可停止往下继续搜索。

#include
#include
#include
using namespace std;
char a[100];
int tot;
double s;
struct node
{
    int next[27],f;
}T[400009];
void trie()
{
    int root=0;
    for(int i=0;a[i];i++)
    {
        if(T[root].next[a[i]-'a'+1]==0)
            T[root].next[ a[i]-'a'+1]=tot++;
            root=T[root].next[ a[i]-'a'+1];
            T[root].next[0]++;

    }

    T[root].f=1;
}
void bfs(int root)
{
    int i;
    for(i=1;i<=26;i++)
        if(T[root].next[i]!=0)
        {
            int nextroot=T[root].next[i];
            if(T[root].next[0]>T[nextroot].next[0])
                s+=T [nextroot].next[0];
            if(T[nextroot].next[0]>1)bfs(nextroot);

        }

}
int main()
{

    int i,n;
    while(scanf("%d",&n)!=EOF)
    {
        s=0;tot=1;
        memset(T,0,sizeof(T));
       for(i=0;i


你可能感兴趣的:(trie,字符串,ACM_字符串)