HDU1894 String Compare 字符串比较

题目链接:HDU1894
这道题不难,但是我掉进了好几个坑= =
1、std::ios::sync_with_stdio(false);
这条语句可以取消输出缓冲的关联,C++的io不仅包括iostream也包含C语言的io, 默认情况下2个缓冲互相同步,这样在程序中可同时使用cin , cout , stdin,stdout。
如果取消了cin.sync_with_stdio(false);这种情况下只可使用cin,在用stdin就产生冲突了。不能跟C的 scanf,sscanf, getchar, fgets之类的一起使用.
切记,如果不加这条语句,cin scanf之类可以一起使用,
如果加了这条语句,一定不能混合使用,只能使用cin cout,否则会出错的。
2、string类用cin输出,cout输出,不能用scanf读入

AC代码

/*
2017年7月30日21:57:04
HDU1894 
WA:11次
TLE:4次
AC代码 
*/ 

#include<stdio.h>  
#include<string> 
#include<iostream>  
#include<algorithm>
using namespace std;
const int maxn=50000+10;
string a[maxn];
int main(){
    /*
    取消同步
    来自网上的解释
    cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,
    也就是说这两种方法可以混用,而不必担心文件指针混乱,
    同时cout和stdout也一样,两者混用不会输出顺序错乱。
    正因为这个兼容性的特性,导致cin有许多额外的开销,
    如何禁用这个特性呢?只需一个语句std::iOS::sync_with_stdio(false);,
    这样就可以取消cin于stdin的同步了 
    */ 
    std::ios::sync_with_stdio(false);

    int t,n,cnt;
    cin>>t;
    while(t--){
        cnt=0;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        /*
        这里排序,主要是为了加快计算,字符串排序
        sort只能对c++里面的string串排序,不能对c里面的字符数组排序 
        先按字典序在按照长度由小到大 
        */
        sort(a,a+n);
        for(int i=0;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                if(a[i].size()<a[j].size()){
                    if(a[i][0]!=a[j][0]) continue;
                    if(a[i].compare(0,a[i].size(),a[j],0,a[i].size())==0) cnt++;
                    else break;
                    /*
                    这个break ,如果当前的a[i] 不是a[j]的前缀,那么剩下的所有a[j]
                    都不可能有a[i]作为前缀了 
                    */
                }
                /*
                这个break,如果当前a[i]的长度大于a[j]的长度,那么按照sort
                排序规则,剩下的显然不会有a[i]作为前缀了 
                */ 
                else break;
                /*
                如果没有这两个break 会超时的! 
                */ 
            }
        }
        /*
        这是一个坑点,题目说了,只有 大于 11519 才取模! 
        */
        if(cnt>11519) 
            cnt=cnt%11519;
        cout<<cnt<<endl;        
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值