sdnu 1099 前缀判断

来源:互联网 发布:晨曦造价软件 编辑:程序博客网 时间:2024/05/20 19:16

Description

给定 n 个字符串,求有多少字符串是其他字符串的前缀。

Input

第一行为一个整数n(1 <= n <= 1000),之后n行,每行一个字符串,字符串只由26个小写字母组成,最大长度为100。

Output

一个整数,有多少字符串是其他字符串的前缀。

Sample Input

5abcdeabbcdebcde

Sample Output

2

此题可用set容器处理

代码如下:

#include <iostream>#include <cstdio>#include <set>#include <cstring>using namespace std;int main(){    int n, i, j = 0;    unsigned int t = 1;    string strs[1005], x;    set <string> s;//每一个被分开的字符串    set <string> c;//所有重复的字符串    scanf("%d", &n);    for(i = 0; i < n; i++)        cin >> strs[i] ;    for(i = 0; i < n; i++){        for(int a = i + 1; a < n; a++){            if(strs[i] == strs[a])//判断输入的所有字符串是否有重复的                c.insert(strs[i]);break;}//将重复的放入容器中    }    for(i = 0; i < n; i++){        for(t = 1; t < strs[i].length(); t++){            x = strs[i].substr(0, t);            s.insert(x);//将分开的字符串放入容器中            }    }    for(i = 0; i < n; i++){        if(s.count(strs[i]) != 0)            j++;//利用循环判断分开的字符串的容器中与总的是否有重合的        else if(c.count(strs[i]) != 0)            j++;//判断是否有重复的字符串,此种情况可以互为前缀    }    printf("%d", j);    return 0;}
有几个知识点需要掌握:

1.string类型只用一般cin输入;

2.

if(s.count(strs[i]) != 0)

此句是判断容器s中的元素能否在strs数组中找到,能找到就return 1,找不到就return0

3.substr(a,b)是将字符串从第a+1位到b+1位分开;

4.判断数组中是否有相同元素还有一种较为简单的方法(借用他人思路)

set <string> part;//截取每个字符串的部分放入里面     set <string> quan;//将每个字符串放入里面     set <string> chong;//重复的字符串放入里面     for(i=0; i<n; i++)     {         cin >> s[i];         if( quan.count(s[i])!=0 )//说明该容器里有这个字符串,返回值为1;否则为零;        chong.insert (s[i]);        quan.insert (s[i]);}