PrintDocument实例所有的订阅事件如下:

  1. 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint =
       new System.Drawing.Printing.PrintDocument();
  2. 设置打印机开始打印的事件处理函数.函数原形如下: void docToPrint_PrintPage(object sender,
       System.Drawing.Printing.PrintPageEventArgs e)
  3. 将事件处理函数添加到PrintDocument的PrintPage事件中。 docToPrint.PrintPage+=new PrintPageEventHandler(docToPrint_PrintPage);
  4. 设置PrintDocument的相关属性,如: PrintDialog1.AllowSomePages = true;PrintDialog1.ShowHelp = true;
  5. 把PrintDialog的Document属性设为上面配置好的PrintDocument的实例: PrintDialog1.Document = docToPrint;
  6. 调用PrintDialog的ShowDialog函数显示打印对话框: DialogResult result = PrintDialog1.ShowDialog();
  7. 根据用户的选择,开始打印: if (result==DialogResult.OK)    {     docToPrint.Print();    }
  8. 打印预览控件PrintPreviewDialog
  9. PrintPreviewControl 在窗体中添加打印预览

例子如下:

使用时先创建PrintService类的实例,然后调用void StartPrint(Stream streamToPrint,string streamType)函数开始打印。其中streamToPrint是要打印的内容(字节流),streamType是流的类型(txt表示普通文本,image表示图像);

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Drawing.Printing;
  7. using System.Windows.Forms;
  8. using System.Drawing;
  9. namespace ConsoleApplication1
  10. {
  11. public partial class PrintTxt:Form
  12. {
  13. private   PrintPreviewDialog PrintPreview = new PrintPreviewDialog();
  14. private   string    StreamType;
  15. private   Image image = null;
  16. private   Stream StreamToPrint = null;
  17. Font mainFont = new Font("宋体", 12);//打印的字体
  18. public string Filename =null;
  19. //1、实例化打印文档
  20. PrintDocument pdDocument = new PrintDocument();
  21. private string[] lines;
  22. private PrintPreviewControl printPreviewControl1;
  23. public PrintTxt()
  24. {
  25. InitializeComponent();
  26. }
  27. private int linesPrinted;
  28. public PrintTxt(string filepath,string filetype):this()
  29. {
  30. Filename = Path.GetFileNameWithoutExtension(filepath);
  31. //订阅BeginPrint事件
  32. pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);
  33. //訂閱EndPrint事件,释放资源
  34. pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);
  35. //订阅Print打印事件,该方法必须放在订阅打印事件的最后
  36. FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
  37. StartPrint(fs, filetype);
  38. //打印结束
  39. pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);
  40. }
  41. //2、启动Print打印方法
  42. public   void StartPrint(Stream streamToPrint, string streamType)
  43. {
  44. //声明返回值的PageSettings A4/A5
  45. PageSettings ps = new PageSettings();
  46. //显示设置打印页对话框
  47. PageSetupDialog Psdl = new PageSetupDialog();
  48. //打印多页设置
  49. PrintDialog pt = new PrintDialog();
  50. pt.AllowCurrentPage = true;
  51. pt.AllowSomePages = true;
  52. pt.AllowPrintToFile = true;
  53. printPreviewControl1.Document = pdDocument;//form中的打印预览
  54. printPreviewControl1.Zoom = 1.0;
  55. printPreviewControl1.Dock = DockStyle.Fill;
  56. printPreviewControl1.UseAntiAlias = true;
  57. StreamToPrint = streamToPrint;//打印的字节流
  58. StreamType = streamType; //打印的类型
  59. pdDocument.DocumentName = Filename; //打印的文件名
  60. Psdl.Document = pdDocument;
  61. PrintPreview.Document = pdDocument;
  62. PrintPreview.SetDesktopLocation(300, 800);
  63. Psdl.PageSettings = pdDocument.DefaultPageSettings;
  64. pt.Document = pdDocument;
  65. try
  66. {
  67. //显示对话框
  68. if (Psdl.ShowDialog() == DialogResult.OK)
  69. {
  70. ps = Psdl.PageSettings;
  71. pdDocument.DefaultPageSettings = Psdl.PageSettings;
  72. }
  73. if (pt.ShowDialog() == DialogResult.OK)
  74. {
  75. pdDocument.PrinterSettings.Copies = pt.PrinterSettings.Copies;
  76. }
  77. if (PrintPreview.ShowDialog() == DialogResult.OK)
  78. //调用打印
  79. pdDocument.Print();
  80. // PrintDocument对象的Print()方法在PrintController类中执行PrintPage事件。
  81. //
  82. }
  83. catch (InvalidPrinterException ex)
  84. {
  85. MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
  86. throw;
  87. }
  88. }
  89. /// <summary>
  90. /// 3、得到打印內容
  91. /// 每个打印任务只调用OnBeginPrint()一次。
  92. /// </summary>
  93. /// <param name="sender"></param>
  94. /// <param name="e"></param>
  95. void pdDocument_BeginPrint(object sender, PrintEventArgs e)
  96. {
  97. char[] param = { '/n' };
  98. char[] trimParam = { '/r' };//回车
  99. switch (StreamType)
  100. {
  101. case "txt":
  102. StringBuilder text = new StringBuilder();
  103. System.IO.StreamReader streamReader = new StreamReader(StreamToPrint, Encoding.Default);
  104. while (streamReader.Peek() >= 0)
  105. {
  106. lines = streamReader.ReadToEnd().Split(param);
  107. for (int i = 0; i < lines.Length; i++)
  108. {
  109. lines[i] = lines[i].TrimEnd(trimParam);
  110. }
  111. }
  112. break;
  113. case "image":
  114. image = System.Drawing.Image.FromStream(StreamToPrint);
  115. break;
  116. default:
  117. break;
  118. }
  119. }
  120. /// <summary>
  121. /// 4、绘制多个打印界面
  122. /// printDocument的PrintPage事件
  123. /// </summary>
  124. /// <param name="sender"></param>
  125. /// <param name="e"></param>
  126. private void OnPrintPage(object sender, PrintPageEventArgs e)
  127. {
  128. int leftMargin = Convert.ToInt32((e.MarginBounds.Left) * 3 / 4);  //左边距
  129. int topMargin = Convert.ToInt32(e.MarginBounds.Top * 2 / 3);    //顶边距
  130. switch (StreamType)
  131. {
  132. case "txt":
  133. while (linesPrinted < lines.Length)
  134. {
  135. //向画布中填写内容
  136. e.Graphics.DrawString(lines[linesPrinted++], new Font("Arial", 10), Brushes.Black, leftMargin, topMargin, new StringFormat());
  137. topMargin += 55;//行高为55,可调整
  138. //走纸换页
  139. if (topMargin >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
  140. {
  141. //如果大于设定的高
  142. e.HasMorePages = true;
  143. printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
  144. /*
  145. * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
  146. * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
  147. */
  148. return;
  149. }
  150. }
  151. break;
  152. case "image"://一下涉及剪切图片,
  153. int width = image.Width;
  154. int height = image.Height;
  155. if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height))
  156. {
  157. width = e.MarginBounds.Width;
  158. height = image.Height * e.MarginBounds.Width / image.Width;
  159. }
  160. else
  161. {
  162. height = e.MarginBounds.Height;
  163. width = image.Width * e.MarginBounds.Height / image.Height;
  164. }
  165. System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(topMargin, leftMargin, width, height);
  166. //向画布写入图片
  167. for (int i = 0; i < Convert.ToInt32(Math.Floor((double)image.Height/ 820)) + 1; i++)
  168. {
  169. e.Graphics.DrawImage(image, destRect, i*820,i*1170 , image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel);
  170. //走纸换页
  171. if (i * 1170 >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
  172. {
  173. //如果大于设定的高
  174. e.HasMorePages = true;
  175. printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
  176. /*
  177. * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
  178. * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
  179. */
  180. return;
  181. }
  182. }
  183. break;
  184. }
  185. //打印完毕后,画线条,且注明打印日期
  186. e.Graphics.DrawLine(new Pen(Color.Black), leftMargin, topMargin, e.MarginBounds.Right, topMargin);
  187. string strdatetime = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
  188. e.Graphics.DrawString(string.Format("打印时间:{0}", strdatetime), mainFont, Brushes.Black, e.MarginBounds.Right-240, topMargin+40, new StringFormat());
  189. linesPrinted = 0;
  190. //绘制完成后,关闭多页打印功能
  191. e.HasMorePages = false;
  192. }
  193. /// <summary>
  194. ///5、EndPrint事件,释放资源
  195. /// </summary>
  196. /// <param name="sender"></param>
  197. /// <param name="e"></param>
  198. void pdDocument_EndPrint(object sender, PrintEventArgs e)
  199. {
  200. //变量Lines占用和引用的字符串数组,现在释放
  201. lines = null;
  202. }
  203. private void InitializeComponent()
  204. {
  205. this.printPreviewControl1 = new System.Windows.Forms.PrintPreviewControl();
  206. this.SuspendLayout();
  207. //
  208. // printPreviewControl1
  209. //
  210. this.printPreviewControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
  211. | System.Windows.Forms.AnchorStyles.Left)
  212. | System.Windows.Forms.AnchorStyles.Right)));
  213. this.printPreviewControl1.Location = new System.Drawing.Point(12, 3);
  214. this.printPreviewControl1.Name = "printPreviewControl1";
  215. this.printPreviewControl1.Size = new System.Drawing.Size(685, 511);
  216. this.printPreviewControl1.TabIndex = 0;
  217. //
  218. // PrintTxt
  219. //
  220. this.ClientSize = new System.Drawing.Size(696, 526);
  221. this.Controls.Add(this.printPreviewControl1);
  222. this.Name = "PrintTxt";
  223. this.ResumeLayout(false);
  224. }
  225. }
  226. //PrintTxt simple = new PrintTxt("D://Mainsoft//12.txt", "txt");
  227. }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Drawing;

namespace ConsoleApplication1
{
public partial class PrintTxt:Form
{

private PrintPreviewDialog PrintPreview = new PrintPreviewDialog();
private string StreamType;
private Image image = null;
private Stream StreamToPrint = null;
Font mainFont = new Font("宋体", 12);//打印的字体
public string Filename =null;

//1、实例化打印文档
PrintDocument pdDocument = new PrintDocument();
private string[] lines;
private PrintPreviewControl printPreviewControl1;

public PrintTxt()
{
InitializeComponent();

}
private int linesPrinted;

public PrintTxt(string filepath,string filetype):this()
{

Filename = Path.GetFileNameWithoutExtension(filepath);

//订阅BeginPrint事件
pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);
//訂閱EndPrint事件,释放资源

pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);

//订阅Print打印事件,该方法必须放在订阅打印事件的最后
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
StartPrint(fs, filetype);

//打印结束
pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);

}

//2、启动Print打印方法
public void StartPrint(Stream streamToPrint, string streamType)
{

//声明返回值的PageSettings A4/A5
PageSettings ps = new PageSettings();

//显示设置打印页对话框
PageSetupDialog Psdl = new PageSetupDialog();

//打印多页设置
PrintDialog pt = new PrintDialog();
pt.AllowCurrentPage = true;
pt.AllowSomePages = true;
pt.AllowPrintToFile = true;

printPreviewControl1.Document = pdDocument;//form中的打印预览
printPreviewControl1.Zoom = 1.0;
printPreviewControl1.Dock = DockStyle.Fill;
printPreviewControl1.UseAntiAlias = true;

StreamToPrint = streamToPrint;//打印的字节流
StreamType = streamType; //打印的类型
pdDocument.DocumentName = Filename; //打印的文件名

Psdl.Document = pdDocument;
PrintPreview.Document = pdDocument;
PrintPreview.SetDesktopLocation(300, 800);
Psdl.PageSettings = pdDocument.DefaultPageSettings;
pt.Document = pdDocument;

try
{
//显示对话框

if (Psdl.ShowDialog() == DialogResult.OK)
{
ps = Psdl.PageSettings;
pdDocument.DefaultPageSettings = Psdl.PageSettings;
}

if (pt.ShowDialog() == DialogResult.OK)
{
pdDocument.PrinterSettings.Copies = pt.PrinterSettings.Copies;
}

if (PrintPreview.ShowDialog() == DialogResult.OK)
//调用打印
pdDocument.Print();

// PrintDocument对象的Print()方法在PrintController类中执行PrintPage事件。
//
}
catch (InvalidPrinterException ex)
{
MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw;
}
}

/// <summary>
/// 3、得到打印內容
/// 每个打印任务只调用OnBeginPrint()一次。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void pdDocument_BeginPrint(object sender, PrintEventArgs e)
{
char[] param = { '/n' };
char[] trimParam = { '/r' };//回车

switch (StreamType)
{
case "txt":
StringBuilder text = new StringBuilder();
System.IO.StreamReader streamReader = new StreamReader(StreamToPrint, Encoding.Default);
while (streamReader.Peek() >= 0)
{
lines = streamReader.ReadToEnd().Split(param);
for (int i = 0; i < lines.Length; i++)
{
lines[i] = lines[i].TrimEnd(trimParam);
}
}

break;
case "image":
image = System.Drawing.Image.FromStream(StreamToPrint);
break;
default:
break;
}

}

/// <summary>
/// 4、绘制多个打印界面
/// printDocument的PrintPage事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnPrintPage(object sender, PrintPageEventArgs e)
{
int leftMargin = Convert.ToInt32((e.MarginBounds.Left) * 3 / 4);  //左边距
int topMargin = Convert.ToInt32(e.MarginBounds.Top * 2 / 3);    //顶边距
switch (StreamType)
{
case "txt":
while (linesPrinted < lines.Length)
{
//向画布中填写内容
e.Graphics.DrawString(lines[linesPrinted++], new Font("Arial", 10), Brushes.Black, leftMargin, topMargin, new StringFormat());

topMargin += 55;//行高为55,可调整

//走纸换页
if (topMargin >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
{
//如果大于设定的高
e.HasMorePages = true;
printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
/*
* PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
* PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
*/
return;
}
}

break;
case "image"://一下涉及剪切图片,
int width = image.Width;
int height = image.Height;
if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height))
{
width = e.MarginBounds.Width;
height = image.Height * e.MarginBounds.Width / image.Width;
}
else
{
height = e.MarginBounds.Height;
width = image.Width * e.MarginBounds.Height / image.Height;
}

System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(topMargin, leftMargin, width, height);
//向画布写入图片
for (int i = 0; i < Convert.ToInt32(Math.Floor((double)image.Height/ 820)) + 1; i++)
{

e.Graphics.DrawImage(image, destRect, i*820,i*1170 , image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel);
//走纸换页
if (i * 1170 >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
{
//如果大于设定的高
e.HasMorePages = true;
printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
/*
* PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
* PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
*/
return;
}
}

break;
}

//打印完毕后,画线条,且注明打印日期
e.Graphics.DrawLine(new Pen(Color.Black), leftMargin, topMargin, e.MarginBounds.Right, topMargin);

string strdatetime = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
e.Graphics.DrawString(string.Format("打印时间:{0}", strdatetime), mainFont, Brushes.Black, e.MarginBounds.Right-240, topMargin+40, new StringFormat());
linesPrinted = 0;
//绘制完成后,关闭多页打印功能
e.HasMorePages = false;

}

/// <summary>
///5、EndPrint事件,释放资源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void pdDocument_EndPrint(object sender, PrintEventArgs e)
{

//变量Lines占用和引用的字符串数组,现在释放
lines = null;
}

private void InitializeComponent()
{
this.printPreviewControl1 = new System.Windows.Forms.PrintPreviewControl();
this.SuspendLayout();
//
// printPreviewControl1
//
this.printPreviewControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.printPreviewControl1.Location = new System.Drawing.Point(12, 3);
this.printPreviewControl1.Name = "printPreviewControl1";
this.printPreviewControl1.Size = new System.Drawing.Size(685, 511);
this.printPreviewControl1.TabIndex = 0;
//
// PrintTxt
//
this.ClientSize = new System.Drawing.Size(696, 526);
this.Controls.Add(this.printPreviewControl1);
this.Name = "PrintTxt";
this.ResumeLayout(false);

}

}
//PrintTxt simple = new PrintTxt("D://Mainsoft//12.txt", "txt");
}

调用方式 PrintTxt simple = new PrintTxt("D://Mainsoft//12.txt", "txt");

验证通过;

来自:http://blog.csdn.net/tsapi/article/details/6237695

C#使用PrintDocument打印 多页 打印预览的更多相关文章

  1. JAVA打印类(带预览)

    package tool; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; ...

  2. Lodop打印设计矩形重合预览线条变粗

    LODOP中的打印设计是辅助进行开发的,实际打印效果应以预览为准,很多效果都是在设计界面显示不出来,或设计和预览界面有差异.例如add_print_text文本的字间距.行间距,旋转,还有允许标点溢出 ...

  3. 【转】C#使用PrintDocument打印 多页 打印预览

    PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...

  4. .Net(c#)打印--多页打印

    如果要实现多页打印,就要使用PrintPageEventArgs类的HasMorePages属性. 我们对之前的代码作如下变更:      增加PrintDocument的BeginPrint和End ...

  5. ABAP FORM打印转PDF/pdf 预览

    function ZSTXBC_SSFCOMP_PDF_PREVIEW. *"-------------------------------------------------------- ...

  6. dedecms 去掉栏目页的预览功能

    首先找到include/typeunit.class.admin.php 再找到 ListAllType 方法,该方法的功能是“读出所有分类” 找到并将该方法内的所以以下代码注释或者删除”<a ...

  7. .NET网页打印以及使用打印需要注意的事项(可能会引起VS崩溃的现象、打印预览后关闭功能不管用)

    这两天进行给网页添加打印.打印预览.页面设置的功能.遇到了以下几个问题 [1]在网上查找了一些打印方法,一开始还可以用,后来不知道动到了哪里,点击vs中拆分或者切换到另一个设计和源代码显示方式,就会引 ...

  8. JS实现浏览器打印、打印预览

    1.JS实现打印的方式方式一:window.print()window.print();会弹出打印对话框,打印的是window.document.body.innerHTML中的内容,下面是从网上摘到 ...

  9. Chrome打开标签页预览

    类似于Microsoft Edge浏览器上的标签页缩略图预览非常方便,其实现在谷歌浏览器正在测试相关的功能,如果想提前体验,就在地址栏输入"chrome://flags"并按下回车 ...

随机推荐

  1. python中enumerate()函数的用法

    描述: enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中.其英文意为:枚举,列举. 函数说明: 语法 ...

  2. Java的BigDecimal容易出现的坑

    BigDecimal一般是用来做要求比较高的精准计算的.前几天在使用的时候遇到一个大坑,记录下. 这个问题产生是使用BigDecimal做除法(divide)运算,这个类的divide方法存在三个常用 ...

  3. mysql中常用函数简介(不定时更新)

    常用函数version() 显示当前数据库版本database() 返回当前数据库名称user() 返回当前登录用户名inet_aton(IP) 返回IP地址的数值形式,为IP地址的数学计算做准备in ...

  4. Linux基础学习-数据备份工具Rsync

    数据备份工具rsync 作为一个系统管理员,数据备份是非常重要的,如果没有做好备份策略,磁盘损坏了,那么你的数据将全部丢失,所以在日常的维护工作中,一定要时刻牢记给数据做备份. rsync不仅可以可以 ...

  5. 离线web-ApplicationCache

    https://www.html5rocks.com/en/tutorials/appcache/beginner/ http://diveintohtml5.info/offline.html#fa ...

  6. 如何创作用纯 CSS 绘制一支栩栩如生的铅笔

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PaZYBw 可交互视频教 ...

  7. cache支持single/increment/increment4三种方式传输

    1.cache bypass signle---data length 已知 increment ---data length 不知 用 last data address  结束数据传输 2.cac ...

  8. Django ORM操作及进阶

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  9. Python之路-迭代器 生成器 推导式

    迭代器 可迭代对象 遵守可迭代协议的就是可迭代对象,例如:字符串,list dic tuple set都是可迭代对象 或者说,能被for循环的都是可迭代对象 或者说,具有对象.__iter__方法的都 ...

  10. 组队赛Day1第一场 GYM 101350A - Sherlock Bones (DP)

    [题意] 给你一个01串.f(i,j)定义为区间[i,j]内1的个数,求区间 [i,j,k] 中 f(i,j) =f(j,k) 的情况的子串总数,要求str[j]=='1'. (题意描述引自Ilook ...