POJ 3193

题意:判断一些句子是不是另一些句子的前缀,并统计是的个数。

题解:将被匹配串读入结构体中排序,然后对于每个匹配串,通过二分在结构体中找。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const int M=1005,N=10005;

 6 struct data

 7 {

 8     char s[100];

 9     bool operator<(const data &ne)const

10     {

11         return strcmp(s,ne.s)<=0;

12     }

13 }pr[M];

14 int main()

15 {

16     int n,m;

17     scanf("%d%d ",&m,&n);

18     for(int i=0;i<m;i++)

19         gets(pr[i].s);

20     sort(pr,pr+m);

21     int cnt=0;

22     for(int i=0;i<n;i++)

23     {

24         char s[100];

25         gets(s);

26         int len=strlen(s);

27         for(int ll=0,rr=m-1,mid;ll<=rr;)

28         {

29             mid=(ll+rr)>>1;

30             int tp=strncmp(pr[mid].s,s,len);

31             if(tp<0)

32                 ll=mid+1;

33             else if(tp>0)

34                 rr=mid-1;

35             else

36                 cnt++,ll=rr+1;

37         }

38     }

39     printf("%d\n",cnt);

40     return 0;

41 }

你可能感兴趣的:(poj)